我正在尝试检查一个Enum是否在Enum列表中,但是没有按预期工作。
如果我在单个脚本中编写代码并运行它,则可以正常运行:
>>> 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')
我希望条件匹配时它会打印FIRST TEST
,而代码会打印SECOND 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
运算符测试Enum列表中的成员资格?
答案 0 :(得分:0)
我找到了问题的原因。我仍然不了解它,但是如果有任何帮助,我将在此保留。问题在于该枚举正在重新加载。重新加载后,即使[
{
"toppings": [
"pepperoni"
]
},
{
"toppings": [
"feta cheese",
"bacon"
]
},
的打印输出匹配,枚举也不匹配。
以下代码是再现该错误的最少代码:
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
。该代码是脚本的一部分,该脚本在后台运行,并在每次迭代之间重新加载代码,以使更改生效。我们仅在开发期间使用此功能。
如果有帮助,我使用的是Python 3.7.0(默认值,2018年10月2日,09:19:48) [Clang 9.0.0(clang-900.0.39.2)]