如果在主模块中定义了枚举,为什么不能跨模块边界正确检查Python 3枚举等式?这是一个例子:
moduleA.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)
moduleB.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
取消注释枚举中的自定义相等运算符会导致断言失败。我发现在两种情况下类模块都不一样,因为在一种情况下它是“__main__”。
解决此问题的最“Pythonic方式”是什么(除了将枚举移动到自己的模块之外)?
编辑:切换到“aVariable是bVariable”也不起作用:
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
答案 0 :(得分:17)
就Python而言,这里有三个模块:
__main__
moduleA
moduleB
从命令行(主入口点)运行的文件始终存储为__main__
模块。如果在代码中的任何位置导入moduleA
,Python会将其视为与__main__
模块分开,而是创建一个新的模块对象。因此,您有两个单独的MyEnum
类:
__main__.MyEnum
moduleA.MyEnum
他们的成员是截然不同的,因此不能平等。
如果您使用的import moduleA
使用import __main__ as moduleA
,或者使用单独的脚本文件来驱动测试,那么您的测试将通过;该单独的文件将成为__main__
:
#!/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 __main__
和moduleA
是一回事; 之前导入moduleA
(或moduleB
,导入moduleA
),您可以向sys.modules
添加另一个条目:
if __name__ == '__main__':
import sys
sys.modules['moduleA'] = sys.modules['__main__']
import moduleB
我不认为这是非常Pythonic。