Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试枚举列表中的成员身份失败_Python_Python 3.x_Enums - Fatal编程技术网

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语句,并且两者都匹配。是的,重新加载可以做到这一点。这是依赖于
重新加载
的众多原因之一。重新加载模块会创建模块中所有函数和类的新版本,但无法更新现有引用、实例或子类类来使用新版本。是的,重新加载可以做到这一点。这是依赖
重新加载
是一个非常糟糕的主意的众多原因之一。重新加载模块会创建模块中所有函数和类的新版本,但它无法更新现有引用、实例或子类来使用新版本。