Проверка членства в списке Enum не удалась - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь проверить, есть ли Enum в списке 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')

Я бы ожидал, что он напечатает 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

IЯ не вижу видимых различий, кроме перечисленных в другом месте, а список KINDS заполняется импортированными константами в другом файле.Что происходит?Почему я не могу проверить членство в списке Enum с оператором in?

1 Ответ

0 голосов
/ 11 июня 2019

Я нашел причину проблемы.Я до сих пор не понимаю, но я оставлю это здесь на случай, если это кому-нибудь поможет.Проблема была в том, что enum перезагружался.После перезагрузки, несмотря на совпадение распечатки для 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 (по умолчанию, 2 октября 2018, 09:19:48) [Clang 9.0.0 (clang-900.0.39.2)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...