Поиск значения в перечислении

Я новичок в питоне. Я пытаюсь проверить, есть ли в строке какие-либо совпадающие значения, определенные внутри 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

Можете ли вы попробовать удалить переопределенные методы из класса и проверить еще раз? В частности, методы __eq__ и __get__

rdas 09.04.2019 20:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метакласс 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

Другие вопросы по теме