【问题标题】:how to check if a variable is of type enum in python如何在python中检查变量是否为枚举类型
【发布时间】:2016-07-15 10:32:21
【问题描述】:

我有一个这样的枚举

@enum.unique
class TransactionTypes(enum.IntEnum):
    authorisation = 1
    balance_adjustment = 2
    chargeback = 3
    auth_reversal = 4

现在我用这个枚举分配一个变量,像这样

a = TransactionTypes

我想检查 'a' 的类型,如果它是枚举,则做一些事情,如果不是枚举,则做其他事情

我试过这样的

if type(a) == enum:
    print "do enum related stuff"
else:
    print "do something else"

问题是它不能正常工作。

【问题讨论】:

  • enum 是模块,为什么会等于type(TransactionTypes)?你想要if issubclass(a, enum.Enum):吗?
  • 您可以使用members special attribute 来迭代成员

标签: python-2.7 enums typechecking


【解决方案1】:

现在我用这个枚举分配一个变量,像这样

a = TransactionTypes

我希望你不是,因为你刚刚分配给a 的是整个枚举,而不是它的一个成员(例如TransactionTypes.chargeback)如果这真的是你想做的,那么正确的测试应该是:

if issubclass(a, enum.Enum)

但是,如果你的意思是这样的:

a = TransactionTypes.authorisation

那么你需要的测试是:

# for any Enum member
if isinstance(a, Enum):

# for a TransactionTypes Enum
if isinstance(a, TransactionTypes):

【讨论】:

    【解决方案2】:

    如前所述,使用isinstance 方法检查天气实例是否为enum.Enum 类型。

    用于演示其用法的小工作代码:

    import enum
    
    
    class STATUS(enum.Enum):
        FINISHED = enum.auto()
        DELETED = enum.auto()
        CANCELLED = enum.auto()
        PENDING = enum.auto()
    
    
    if __name__ == "__main__":
        instance = STATUS.CANCELLED
    
        if isinstance(instance, enum.Enum):
            print('name : ', instance.name, ' value : ', instance.value)
        else:
            print(str(instance))
    

    输出:

    name :  CANCELLED  value :  3
    

    【讨论】:

      【解决方案3】:

      可靠的解决方案:

      from enum import IntEnum
      from collections import Iterable
      
      def is_IntEnum(obj):
          try:
              return isinstance(obj, Iterable) and isinstance (next(iter(obj)), IntEnum)
          except:
              return False # Handle StopIteration, if obj has no elements
      

      【讨论】:

      • 您发现接受的答案有哪些不可靠的地方?
      • @EthanFurman from enum import IntEnum, Enum class MyEnum(IntEnum): FOO_BAR = 0 JOHN_DOE = 1 print( isinstance(MyEnum, Enum) ) # False print( isinstance(MyEnum, IntEnum) ) # False
      • 您使用了错误的比较:MyEnum 是一种类型,并且要检查一种类型是否是另一种类型的子类,请使用 issubclass;所以你的例子应该是issubclass(MyEnum, Enum)issubclass(MyEnum, IntEnum),它们都会返回Trueisinstance 适用于 isinstance(MyEnum.JOHN_DOE, IntEnum)
      • 您的答案使用issubclass,这将在非类对象上引发错误。 List 和 enum 都是可迭代的,两者都可以用作某事物的可迭代选择列表。因此,您的答案不是可靠的解决方案。我的回答可能不漂亮,但它是可靠的。因此,您对我的减分是不合理的。
      • 根据我对子类使用isinstance() 检查的经验,一直是错误的:issubclass() 是正确的选择,或者我在比较错误的对象。您的“可靠”方法将隐藏这些错误。如果您可以在答案中添加一个示例,其中 listIntEnum 成员将是合适的值,我会很乐意删除我的反对票。
      【解决方案4】:

      我以为我有一个丑陋的方法。例如:

      print(o.__class__.__class__) 
      

      输出:

      <enum.EnumMeta>
      

      【讨论】:

      • 欢迎来到 Stack Overflow!我看不出这如何回答本页顶部的问题,但应该如此。请edit根据How to Answer或删除答案。否则,它可能会被标记为“不是答案”并被删除。
      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 2011-12-24
      • 1970-01-01
      • 2018-06-16
      • 2012-02-16
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多