如果我遗漏了任何明显的东西,我深表歉意;有没有办法查看一个值是否在枚举中,如果是,则返回 True,否则返回 False?例如,如果我从 python 文档中获取以下枚举,
from enum import Enum
class Colour(Enum):
RED = 1
GREEN = 2
BLUE = 3
是否有任何方法可以在不引发异常的情况下执行以下操作或等效操作:
colour_test = "YELLOW"
if Colour[colour_test]:
print("In enum")
else:
print("Not in enum")
## Output wanted - "Not in enum"
## Actual output - KeyError: "YELLOW"
我知道我可以使用 try;except 语句,但我不想在这种情况下使用,因为我想将此条件语句与其他语句一起使用。
答案 0 :(得分:7)
枚举有一个 __members__
dict,您可以检查:
if colour_test in Colour.__members__:
print("In enum")
else:
print("Not in enum")
您也可以使用带有 hasattr
的通用方法,但这会为某些非成员(如 "__new__"
)返回错误结果:
if hasattr(Colour, colour_test):
print("In enum")
else:
print("Not in enum")
答案 1 :(得分:1)
if colour_test in Colour.__members__:
print("In enum")
else:
print("Not in enum")
答案 2 :(得分:1)
您可以做的最简单的事情是添加 try.. except 块,其中 except 块将捕获 KeyError。
colour_test = "YELLOW"
try:
if Colour[colour_test]:
print("In enum")
except KeyError:
print("Not in enum")
答案 3 :(得分:0)
getattr
使用默认参数可能是最简单的方法:
gotten = getattr(Colour, "GREEN", None)
if gotten is None:
# Not in the enum
else:
# gotten is in the enum
如果 gotten
不存在,它将是 None
(或者你把它作为 getattr
的第三个参数)。
或者,使用 :=
使其更简洁:
if gotten := getattr(Colour, "GREEN", None):
# The string is in the enum
else:
# Not in the enum
回想起来,@Aplet 对 hasattr
的建议在这里可能更合适。我喜欢带有 getattr
第三个参数的 None
,因为很多时候,如果我正在检查某物是否具有属性,我也想在检查后使用该属性。如果您只关心它是否存在,请使用 hasattr
,但如果您还想使用 post-lookup 值,getattr
很好。
答案 4 :(得分:0)
如果有问题的枚举是您的,请为它们添加一个函数:
from enum import Enum
class CustomEnum(Enum):
#
@classmethod
def has_enum(cls, name):
return name in cls.__members__
class Color(CustomEnum):
RED = 1
BLUE = 2
GREEN = 3
并在使用中:
>>> Color.has_enum('RED')
True
如果您希望能够使用不受您控制的枚举来执行此操作,请提取上面的 has_enum
函数:
def has_enum(cls, name):
return name in cls.__members__
并使用它:
>>> has_enum(Color, 'GREEN')
True
披露:我是 Python stdlib Enum
、enum34
backport 和 Advanced Enumeration (aenum
) 库的作者。