如何检查 python 中的变量是否为枚举类型

how to check if a variable is of type enum in python

我有一个这样的枚举

@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"

问题是它不能正常工作。

Now i am assigning a variable with this enum like this

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):

可靠的解决方案:

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

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

print(o.__class__.__class__) 

输出:

<enum.EnumMeta>

如前所述,使用 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