gpt4 book ai didi

跨模块的 Python 枚举

转载 作者:太空狗 更新时间:2023-10-29 18:00:12 24 4
gpt4 key购买 nike

如果枚举已在主模块中定义,为什么在 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

在枚举中取消注释自定义相等运算符会导致断言失败。我发现类模块在这两种情况下都不相同,因为在一种情况下它是“__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

最佳答案

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

  • __main__
  • moduleA
  • moduleB

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

  • __main__.MyEnum
  • moduleA.MyEnum

它们的成员是不同的,因此不能相等。

如果您使用 import __main__ as moduleA 而不是使用 import 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(或导入moduleAmoduleB)之前,您可以向sys 添加另一个条目。模块:

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

import moduleB

我不认为这很 Pythonic。

关于跨模块的 Python 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26589805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com