1

我曾假设在 Python 中如果我做一些

class A:
    print("hi")

如果我用一些明确删除 A,这个“hi”只会被打印不止一次del A

在我稍大的项目中,我有以下代码(名称已更改):

class A(ISomething):
    print(threading.current_thread())
    try:
        A.MY_DICT  # yeah, this should never ever result in anything but an error but neither should this code be run twice
        print(A.MY_DICT)
    except NameError:
        print("A.MY_DICT unknown")
    MY_DICT = {}

它产生这个输出:

$ python main.py 
<_MainThread(MainThread, started 140438561298240)>
A.MY_DICT unknown
<_MainThread(MainThread, started 140438561298240)>
A.MY_DICT unknown

所以在同一个线程上,相同的类级代码被执行两次。当我从来没有的时候,这怎么可能del A?该代码以前有效,但我没有承诺缩小破坏它的更改范围。

使用 MY_DICT 而不是 A.MY_DICT 的相同代码同样失败,并且 PyDev 在撰写本文时已经告诉我这不起作用,我非常有信心发生了一些可疑的事情。

4

1 回答 1

3

您可能正在以不同的名称导入文件,或者将其作为__main__文件运行并导入。

当 Python 运行您的脚本(在命令行中命名的文件)时,它会为其命名为__main__,这是存储在sys.modules. 但是,如果您随后使用import语句导入同一个文件,它将再次运行,并且生成的命名空间存储在模块名称下。

因此,python main.pywheremain.py包含一个import main语句或导入其他代码,然后main再次导入将导致所有代码main.py运行两次。

另一种选择是您以不同的全名两次导入模块;既作为包的一部分,也作为独立模块。当包含包的目录包本身都列在sys.path模块搜索路径中时,可能会发生这种情况。

于 2013-06-21T20:38:18.973 回答