Я новичок в питоне. Я пытаюсь проверить, есть ли в строке какие-либо совпадающие значения, определенные внутри Enum. Например, я хочу напечатать «Найдено» в приведенном ниже коде.
Я добавил определения следующих неявных методов для поддержки методов сравнения, хеширования и получения.
from enum import Enum
class States(Enum):
COMPLETED_STATE = 'completed'
DEPENDENCY_WAIT_STATE = 'dependency_wait'
FAILED_NO_RERUN_STATE = 'failed_no_rerun'
IGNORED_STATE = 'ignored'
RUNNING_STATE = 'running'
NEVER_RUN_STATE = 'never_run'
ON_HOLD_STATE = 'on_hold'
def __hash__(self):
return hash(self.value)
def __str__(self):
return self.value
def __eq__(self, other):
if type(self) == type(other):
return self.value == other.value
return self.value == other
def __get__(self, *args, **kwargs):
return self.value
Map = {
States.ON_HOLD_STATE: [States.NEVER_RUN_STATE],
States.DISABLED_STATE: [States.NEVER_RUN_STATE],
States.RUNNING_STATE: [States.DEPENDENCY_WAIT_STATE,
States.ON_HOLD_STATE,
States.NEVER_RUN_STATE],
States.IGNORED_STATE: [States.RUNNING_STATE,
States.NEVER_RUN_STATE]
}
print(Map[States.RUNNING_STATE]) // ['dependency_wait', 'on_hold', 'never_run']
print(Map['running']) // ['dependency_wait', 'on_hold', 'never_run']
print(States.RUNNING_STATE == 'dependency_wait') // False
print(States.RUNNING_STATE == 'running') // True
print(States.RUNNING_STATE == States.RUNNING_STATE) // True
if 'running' in States:
print "Found" // Does not gets printed
if States.RUNNING_STATE in States:
print "Found here" // Does not gets printed
Метакласс Enum
, EnumMeta
, определяет магический метод __contains__
для проверки того, является ли экземпляр Enum
членом данного класса Enum
только на основе имени члена, а не значения, поэтому, если вы хотите, чтобы он мог проверять членство на основе значения, вам придется переопределить EnumMeta.__contains__
функцией, которая перебирает значения атрибута _member_map_
dict и сравнивает значение каждого члена с заданным тестовым значением, чтобы достичь этого:
from enum import Enum, EnumMeta
def custom_EnumMeta__contains__(cls, member):
return isinstance(member, cls) and member.name in cls._member_map_ or \
any(m._value_ == member for m in cls._member_map_.values())
EnumMeta.__contains__ = custom_EnumMeta__contains__
class States(Enum):
COMPLETED_STATE = 'completed'
DEPENDENCY_WAIT_STATE = 'dependency_wait'
FAILED_NO_RERUN_STATE = 'failed_no_rerun'
IGNORED_STATE = 'ignored'
RUNNING_STATE = 'running'
NEVER_RUN_STATE = 'never_run'
ON_HOLD_STATE = 'on_hold'
if 'running' in States:
print "Found"
if States.RUNNING_STATE in States:
print "Found here"
Это выводит:
Found
Found here
Можете ли вы попробовать удалить переопределенные методы из класса и проверить еще раз? В частности, методы
__eq__
и__get__