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]