python - 测试枚举列表中的成员身份失败

标签 python python-3.x enums

我正在尝试检查枚举是否在枚举列表中,但它没有按预期工作。

如果我在单个脚本中编写代码并运行它,它就可以正常工作:

>>> 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/

相关文章:

python - 删除 QTableView + QAbstractItemModel 中的几行

python - Python 闭包中的可变绑定(bind)时间

python - 用 JSON 中的字符串列表替换单词中的多个相等字符串

java - 强制对象字段仅具有从父类继承的某些值

C 是否可以使用值作为枚举名称?

python - Matplotlib 渲染条形图不正确

python -/usr/bin/python : No module named pip under mac/install python package in mac

python - 替换文本中的空格(多行)

python-3.x - tensorflow 和 keras - SQS 生产中的快速推理

java - 如何在 Java 中将对象转换为 Enum 并获取当前值