Python 测试枚举列表中的成员身份失败
我试图检查枚举是否在枚举列表中,但它没有按预期工作 如果我在一个脚本中编写代码并运行它,它可以正常工作:Python 测试枚举列表中的成员身份失败,python,python-3.x,enums,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
>>> 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')
当条件匹配时,我希望它打印第一次测试
,而代码打印第二次测试
:
<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
ActionKind.TALK
[, ]
没有种类
等等
[, ]
第二次测试
我看不到任何明显的区别,除了枚举是在别处定义的,种类列表是从另一个文件中导入的常量填充的。发生了什么事?为什么我不能用
in
操作符测试枚举列表中的成员身份?我找到了问题的原因。我仍然不明白,但我会把这个留在这里,以防它对任何人都有帮助。问题是正在重新加载枚举。重新加载后,即使print(type(node.action.kind)。\uuuu模块\uuuu
的打印输出匹配,枚举也不匹配
以下代码是再现错误的最小代码:
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
的第一次调用工作正常,并且打印第一次测试
。在重新加载模块后,它停止工作,而打印第二次测试
。此代码是在后台运行的脚本的一部分,在迭代之间重新加载代码,以便更改生效。我们仅使用此函数发展中的个性
如果有帮助的话,我使用的是Python 3.7.0(默认值,2018年10月2日,09:19:48)
[Clang 9.0.0(Clang-900.0.39.2)]我找到了问题的原因。我仍然不明白这一点,但我将把它留在这里,以防它对任何人都有帮助。问题是枚举正在重新加载。重新加载后,即使
打印(type(node.action.kind)。\uu模块\uuuuu
的打印输出匹配,枚举也不匹配
以下代码是再现错误的最小代码:
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
的第一次调用工作正常,并且打印第一次测试
。在重新加载模块后,它停止工作,而打印第二次测试
。此代码是在后台运行的脚本的一部分,在迭代之间重新加载代码,以便更改生效。我们仅使用此函数发展中的个性
如果有帮助的话,我使用的是Python 3.7.0(默认值,2018年10月2日,09:19:48)
[Clang 9.0.0(Clang-900.0.39.2)]@PatrickArtner OP询问输出的第二部分,其中
ActionKind.WAIT
显然在Cates
列表中,但是node.action.kind in Cates
返回False
,即使node.action.kind
显然等于ActionKind.WAIT
。您能告诉我们node.a是如何返回的吗Action.kind
和ActionKind
被定义,以及KINDS
是如何填充的?您可以删减不相关的部分,以创建一个最小但可重复的示例。这听起来好像您实际上有两个ActionKind
枚举,可能是由于涉及主脚本文件的循环导入。请尝试打印(键入(node.action.kind)。\uuuuuu模块\uuuuuuuu,类型(种类[0])。\uuuuuuu模块\uuuuuu)
@user2357112我添加了print语句和两者的匹配。@PatrickArtner OP询问输出的第二部分,其中ActionKind.WAIT
显然在种类
列表中,但是节点.action.kind种类
返回False
,即使节点.action.kind
显然等于ActionKind.WAIT
。您能告诉我们如何定义node.action.kind
和ActionKind
,以及如何填充KINDS
吗?您可以删减不相关的部分,以创建一个最小但可重复的示例。这听起来好像您实际上有两个ActionKind
枚举,可能是由于到涉及主脚本文件的循环导入。请尝试打印(类型(node.action.kind)。\u模块\u,类型(种类[0])。\u模块\u@user2357112我添加了print语句,并且两者都匹配。是的,重新加载可以做到这一点。这是依赖于重新加载
的众多原因之一。重新加载模块会创建模块中所有函数和类的新版本,但无法更新现有引用、实例或子类类来使用新版本。是的,重新加载可以做到这一点。这是依赖重新加载是一个非常糟糕的主意的众多原因之一。重新加载模块会创建模块中所有函数和类的新版本,但它无法更新现有引用、实例或子类来使用新版本。