Python跨模块枚举

Python跨模块枚举,python,module,enums,Python,Module,Enums,如果在主模块中定义了枚举,为什么在Python 3中不能跨模块边界正确检查枚举相等性?以下是一个例子: 模块a.py: #!/usr/bin/python3 import moduleB from enum import Enum, unique @unique class MyEnum(Enum): A = 1 B = 2 # def __eq__(self,other): # assert isinstance(other,self.__class

如果在主模块中定义了枚举,为什么在Python 3中不能跨模块边界正确检查枚举相等性?以下是一个例子:

模块a.py:

#!/usr/bin/python3

import moduleB
from enum import Enum, unique

@unique
class MyEnum(Enum):
    A = 1
    B = 2
    # def __eq__(self,other):
    #     assert isinstance(other,self.__class__)
    #     return self.value == other.value

if __name__ == "__main__":

    myVar = MyEnum.B
    moduleB.doStuff(myVar)
模块b.py:

#!/usr/bin/python3

import moduleA

def doStuff(aVariable):
    bVariable = moduleA.MyEnum.B
    assert aVariable == bVariable
在命令行上调用“/moduleA.py”会产生:

Traceback (most recent call last):
  File "./moduleA.py", line 17, in <module>
    moduleB.doStuff(myVar)
  File "/home/ruedi/Dropbox/Reps/stuffed/sosy/testing/moduleB.py", line 7, in doStuff
    assert aVariable == bVariable
AssertionError
回溯(最近一次呼叫最后一次):
文件“/moduleA.py”,第17行,在
模块B.doStuff(myVar)
文件“/home/ruedi/Dropbox/Reps/culled/sosy/testing/moduleB.py”,第7行,doStuff格式
assert aVariable==bVariable
断言错误
在枚举中取消注释自定义相等运算符会导致断言失败。我发现类模块在两种情况下都不一样,因为在一种情况下它是“\uuuu main\uuuuu”

解决此问题的最“Pythonic方式”是什么(除了将枚举移动到自己的模块)

编辑:切换到“可变即可变”也不起作用:

Traceback (most recent call last):
  File "./moduleA.py", line 17, in <module>
    moduleB.doStuff(myVar)
  File "/home/ruedi/Dropbox/Reps/stuffed/sosy/testing/moduleB.py", line 7, in doStuff
    assert aVariable is bVariable
AssertionError
回溯(最近一次呼叫最后一次):
文件“/moduleA.py”,第17行,在
模块B.doStuff(myVar)
文件“/home/ruedi/Dropbox/Reps/culled/sosy/testing/moduleB.py”,第7行,doStuff格式
断言aVariable是bVariable
断言错误

就Python而言,这里有三个模块:

  • \uuuuu main\uuuuuu
  • moduleA
  • moduleB
从命令行(主入口点)运行的文件始终存储为
\uuuu main\uuu
模块。如果将
moduleA
导入代码中的任意位置,Python会将其视为与
\uuuuu main\uuuuu
模块分开,并创建一个新的模块对象。因此,您有两个独立的
MyEnum
类:

  • \uuuu main\uuuu.MyEnum
  • moduleA.MyEnum
他们的成员是不同的,因此不能平等

如果您没有使用
import moduleA
而是使用
import\uu main\uuuuu作为moduleA
,或者使用单独的脚本文件来驱动测试,则测试通过;这个单独的文件将成为
\uuuuuu main\uuuuu

#!/usr/bin/python3
# test.py, separate from moduleA.py and moduleB.py

import moduleA    
import moduleB

if __name__ == "__main__":
    myVar = moduleA.MyEnum.B
    moduleB.doStuff(myVar)
另一种解决方法是告诉Python,
\uuuuuu main\uuuuu
moduleA
是同一件事;在导入
moduleA
(或导入
moduleA
moduleB
)之前,您可以向
sys.modules
添加另一个条目:

if __name__ == '__main__':
    import sys
    sys.modules['moduleA'] = sys.modules['__main__']

import moduleB

<>我不认为这是一个非常复杂的例子。

为什么有这样一个很好的原因,为什么它区分了<代码>你不希望它们是一样的吗?@TankorSmash:它们是分开的,因为你需要一种方法来区分主入口点(脚本)和你导入的模块。这就是为什么
如果uuuu name\uuuu=='\uuuuu main\uuuuu':
首先起作用的原因。