gpt4 book ai didi

Python 枚举类成员

转载 作者:太空狗 更新时间:2023-10-30 01:12:26 25 4
gpt4 key购买 nike

使用 Enum 时Python 3 中引入的类 programmatically , 程序员应该如何检查给定整数的枚举成员资格?

显然,您可以只 ask for forgiveness但是有没有我错过的成员(member)检查功能?更明确地说,我想取一个整数值并检查它的值是否对应于一个有效的枚举。

from enum import Enum

class TestEnum(Enum):
a = 0
b = 1
c = 2

输出:

In [13]: TestEnum(0)
Out[13]: <TestEnum.a: 0>

In [14]: TestEnum(4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-14-09c663e9e214> in <module>()
----> 1 TestEnum(4)

C:\Anaconda3\lib\enum.py in __call__(cls, value, names, module, qualname, type, start)
239 """
240 if names is None: # simple value lookup
--> 241 return cls.__new__(cls, value)
242 # otherwise, functional API: we're creating a new Enum type
243 return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start)

C:\Anaconda3\lib\enum.py in __new__(cls, value)
474 if member._value_ == value:
475 return member
--> 476 raise ValueError("%r is not a valid %s" % (value, cls.__name__))
477
478 def __repr__(self):

ValueError: 4 is not a valid TestEnum

最佳答案

Enum 确实有一个 __contains__方法,但它检查成员名称而不是成员值:

def __contains__(cls, member):
return isinstance(member, cls) and member._name_ in cls._member_map_

在内部(在 CPython 中)它们确实有一个将值映射到名称的私有(private)属性(虽然只适用于可散列值):

>>> 2 in TestEnum._value2member_map_
True
>>> 3 in TestEnum._value2member_map_
False

但是依赖私有(private)属性并不是一个好主意,因为它们可以随时更改,因此您可以添加自己的循环遍历 __members__.values() 的方法:

>>> class TestEnum(Enum):
... a = 0
... b = 1
... c = 2
...
... @classmethod
... def check_value_exists(cls, value):
... return value in (val.value for val in cls.__members__.values())
...

>>>
>>> TestEnum.check_value_exists(2)
True
>>> TestEnum.check_value_exists(3)
False

关于Python 枚举类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42830212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com