猿问

在枚举中搜索值

我是python的新手。我正在尝试检查字符串是否具有在 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


慕哥6287543
浏览 208回答 1
1回答

潇潇雨雨

元级Enum,EnumMeta定义了__contains__测试魔术方法,如果一个Enum实例是一个给定的成员Enum仅基于成员的名称,而不是值类,所以如果你希望它能够基于值测试会员,你将有EnumMeta.__contains__使用遍历_member_map_dict 属性值的函数进行覆盖,并将每个成员值与给定的测试值进行比较以实现:from enum import Enum, EnumMetadef 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"这输出:FoundFound here
随时随地看视频慕课网APP

相关分类

Python
我要回答