【问题标题】:Python defines my class twice on the same threadPython 在同一个线程上定义了我的类两次
【发布时间】:2013-06-21 20:30:10
【问题描述】:

如果我做一些事情,我曾假设在 Python 中是这样的

class A:
    print("hi")

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

在我稍微大一点的项目中,我有这个代码(名称已更改):

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 在撰写本文时已经告诉我这不起作用,我非常有信心发生了一些可疑的事情。

【问题讨论】:

  • main.py中是否有import语句?请向我们展示完整的 main.py 内容。
  • 您需要提供有关您的代码的更多信息,最好是一个实际可运行的示例。例如,如果您以不同的名称两次导入相同的模块(例如,一次作为顶级模块,一次作为包的一部分),则可能会发生这种行为。 (另外,删除 A 不会导致类定义重新执行。)
  • 这段代码是在单独的模块中导入的吗?还是在某些功能中?
  • 主脚本(你在命令行中命名的那个)被导入为__main__;如果您导入与模块相同的文件,它将获得一个新的命名空间(在这种情况下为main),并将为该命名空间重新执行。
  • @BrenBarn 这正是我需要的答案类型。谢谢。将检查出来。我无法通过一些简单的例子来重现双定义,两个文件动态地相互导入几次。

标签: python class-variables symbol-table


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 2014-05-30
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多