如果枚举中存在值,则返回 True;如果不是,则返回 false

时间:2021-01-01 16:34:23

标签: python enums

如果我遗漏了任何明显的东西,我深表歉意;有没有办法查看一个值是否在枚举中,如果是,则返回 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 语句,但我不想在这种情况下使用,因为我想将此条件语句与其他语句一起使用。

5 个答案:

答案 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 Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。