Some useful Python enum tricks.

Exclude some items in enum iteration

iteritems return a generator that skip Foo.A.

from enum import Enum

class Foo(Enum):
    A = 0
    B = 1
    C = 2
    D = 3

    def __repr__(self):
        return self.name

    @classmethod
    def iteritems(cls):
        for ele in cls:
            if ele == cls.A:
                continue
            yield ele

def main():
    print([f for f in Foo])
    print([f for f in Foo.iteritems()])

if __name__ == "__main__":
    main()
# [A, B, C, D]
# [B, C, D]

Convert enum element to integer

Inheriting from IntEnum enables direct casting.

from enum import Enum, IntEnum

class Foo(Enum):
    A = 0
    B = 1

class Bar(IntEnum):
    A = 0
    B = 1

def main():
    # print(int(Foo.A)) # TypeError: int() argument must be a string, a bytes-like object or a real number, not 'Foo'
    print(int(Foo.A.value)) # OK

    print(int(Bar.A)) # OK
    print(int(Bar.A.value)) # OK

if __name__ == "__main__":
    main()
# 0
# 0
# 0

Dynamic Overwrite Python Enum

import types
from enum import Enum

class Foo(Enum):
    A = 0
    B = 1

    def __repr__(self):
        return self.name

class MetaFoo(Enum):
    def __repr__(self):
        return self.name

    @classmethod
    def some_method(cls):
        return cls.A

def main():
    print([f for f in Foo])

    # Overwrite with dynamic data for enum elements
    _Foo = types.new_class("_Foo", bases=(MetaFoo,))
    enum_data = {
        "C": 0,
        "D": 1,
        "E": 2,
    }
    globals()['Foo'] = _Foo("Foo", enum_data)
    print([f for f in Foo])

if __name__ == "__main__":
    main()
# [A, B]
# [C, D, E]
  • ⊛ Back to top
  • ⊛ Go to bottom