Python跨模块枚举
如果在主模块中定义了枚举,为什么在Python 3中不能跨模块边界正确检查枚举相等性?以下是一个例子: 模块a.py: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
#!/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':
首先起作用的原因。