测试Enum列表中的成员资格失败

时间:2019-06-11 17:45:48

标签: python python-3.x enums

我正在尝试检查一个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列表中的成员资格?

1 个答案:

答案 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)]