如果在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 is 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
__main__
和moduleA
?难道你不认为它们应该是一样的吗? - TankorSmashif __name__ == '__main__':
起作用的原因。 - Martijn Pieters