我正在尝试检查枚举是否在枚举列表中,但它没有按预期工作。
如果我在单个脚本中编写代码并运行它,它就可以正常工作:
>>> from enum import Enum
>>> class X(Enum):
... A = 'a'
... B = 'b'
... C = 'c'
...
>>> s = [X.A, X.B]
>>> x = X.C
>>> y = X.B
>>> x in s
False
>>> y in s
True
然而,在我的代码中,测试似乎不起作用。 这是我添加的用于调试行为的内容:
print(type(node.action.kind), node.action.kind)
print(type(KINDS), type(KINDS[0]), KINDS)
if node.action.kind in KINDS:
print('FIRST TEST')
elif node.action.kind.value in [i.value for i in KINDS]:
print('SECOND TEST')
else:
print('NOT IN KINDS')
当条件匹配但代码打印SECOND TEST
时,我希望它打印FIRST TEST
:
<enum 'ActionKind'> ActionKind.TALK
<class 'list'> <enum 'ActionKind'> [<ActionKind.CALL: 'api_call'>, <ActionKind.WAIT: 'wait'>, <ActionKind.HANGUP: 'hangup'>]
NOT IN KINDS
<enum 'ActionKind'> ActionKind.WAIT
<class 'list'> <enum 'ActionKind'> [<ActionKind.CALL: 'api_call'>, <ActionKind.WAIT: 'wait'>, <ActionKind.HANGUP: 'hangup'>]
SECOND TEST
除了枚举在其他地方定义以及 KINDS 列表是从另一个文件中导入的常量填充之外,我看不到任何明显的差异。怎么了?为什么我无法使用 in
运算符测试枚举列表中的成员资格?
最佳答案
我找到了问题的原因。我仍然不明白,但我会把它留在这里,以防它对任何人有帮助。问题在于枚举正在重新加载。重新加载后,即使 print(type(node.action.kind).__module__
的打印输出匹配,但枚举不匹配。
以下代码是重现错误的最小代码:
import mylib.classes
from mylib.classes import *
import mylib.renderer
from mylib.renderer import *
nodes = get_nodes() # from classes
check_nodes(nodes) # from renderer
from importlib import reload
reload(mylib.classes)
reload(mylib.renderer)
check_nodes(nodes) # from renderer
第一次调用 check_nodes
工作正常,并打印 FIRST TEST
。重新加载模块后,它停止工作并打印 SECOND TEST
。此代码是在后台运行的脚本的一部分,并在迭代之间重新加载代码以使更改生效。我们仅在开发过程中使用此功能。
如果有帮助,我使用的是 Python 3.7.0(默认,2018 年 10 月 2 日,09:19:48) [Clang 9.0.0 (clang-900.0.39.2)]
关于python - 测试枚举列表中的成员身份失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56549172/