An extension to the standard enum with polymorphism, and abstract methods.
Project description
enumex
An extension to the standard enum with polymorphism, and abstract methods.
Install
Python: 3.9.x
Each package version is tightly coupled to the minor Python version. Depending on which Python version your environment is currently using, pip will install the correct package.
pip install enumex
Usage
Importing
EnumEx works alongside the standard library’s enum module.
Use EnumEx from enumex, and auto from enum:
from enumex import EnumEx
from enum import auto
EnumEx Types:
| Type | Min Version |
|---|---|
| EnumEx | all |
| IntEnumEx | all |
| FlagEx | all |
| IntFlagEx | all |
| StrEnumEx | 3.11 |
| ReprEnumEx | 3.11 |
Example
EnumEx behaves like the standard enum, but supports inheritance and abstract enum classes.
from enumex import EnumEx
from enum import auto
class A(EnumEx):
Val1 = auto()
Val2 = auto()
def print(self):
print(f"{self.__class__.__name__} {self.name} : {self.value}")
class B(A):
Val3 = auto()
Val4 = auto()
print("Printing A...")
for e in A:
e.print()
print("\nPrinting B...")
for e in B:
e.print()
# > Printing A...
# > A Val1 : 1
# > A Val2 : 2
# >
# > Printing B...
# > B Val1 : 1
# > B Val2 : 2
# > B Val3 : 3
# > B Val4 : 4
Abstract Methods
-
Defining Abstract Enum Classes
To define an abstract enum class, you must includeABCas a mixin.
UsingABCMetaas the metaclass is not enough by itself.EnumExMetainherits fromenum.EnumMeta, and to avoid metaclass conflicts when combining it withABC, it must also inherit fromABCMeta.
Because of this, abstract-method enforcement was changed to only activate when the enum actually subclassesABC. -
Member Access Behavior
Enum members of an abstract enum (e.g.,A.Flag1) are still accessible.
This is by design: abstractness is enforced only when invoking abstract methods. -
Instantiation Behavior
Even though calling an enum class (A(1)) normally just performs a member lookup, an exception is still raised when the class is abstract.
from abc import ABC, abstractmethod
from enumex import IntFlagEx
from enum import auto
class A(ABC, IntFlagEx):
Flag1 = auto()
Flag2 = auto()
@abstractmethod
def print(self):
pass
class B(A):
Flag3 = auto()
Flag4 = auto()
def print(self):
print(f"{self.__class__.__name__} {self.name} : {self.value}")
print(f"A(1) = ", end='')
try:
v = A(1)
print(v)
except Exception as e:
print(f"Error:", e)
print(f"B(5) = {B(5):#b}")
print(f"\nA.Flag1 | B.Flag3 = ", end='')
try:
v = A.Flag1 | B.Flag3 # Attempts to create A instance
print(v)
except Exception as e:
print(f"Error:", e)
v = B.Flag3 | A.Flag1
print(f"B.Flag3 | A.Flag1 = {v:#b}")
try:
print("\nInvoking A.print...")
for e in A:
e.print()
except Exception as ex:
print("Error: ", ex)
print("\nManually Printing A...")
for e in A:
print(f"{e.__class__.__name__} {e.name} : {e.value}")
print("\nInvoking B.print...")
for e in B:
e.print()
# > A(1) = Error: ("Can't instantiate abstract class A with abstract method", 'print')
# > B(5) = 0b101
# >
# > A.Flag1 | B.Flag3 = Error: ("Can't instantiate abstract class A with abstract method", 'print')
# > B.Flag3 | A.Flag1 = 0b101
# >
# > Invoking A.print...
# > Error: Cannot call abstract method 'print' on abstract enum 'A'
# >
# > Manually Printing A...
# > A Flag1 : 1
# > A Flag2 : 2
# >
# > Invoking B.print...
# > B Flag1 : 1
# > B Flag2 : 2
# > B Flag3 : 4
# > B Flag4 : 8
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file enumex-3.9.tar.gz.
File metadata
- Download URL: enumex-3.9.tar.gz
- Upload date:
- Size: 21.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc2eff3a55cef5456f62e7853395dd784e0f9b4cd4fe0485e54e4bb70b8dea0e
|
|
| MD5 |
00dc8cfa31b9a43b368e928c9998b70d
|
|
| BLAKE2b-256 |
b7221d1976167761b42e8b4320d586e4240a93a4d9dada4f147537d0a0b6fd1a
|
File details
Details for the file enumex-3.9-py3-none-any.whl.
File metadata
- Download URL: enumex-3.9-py3-none-any.whl
- Upload date:
- Size: 20.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0b1b234bf0d569dfd4c9d9c9e889cad31507b297ed3a0dbdcd59db0b7ce57fb
|
|
| MD5 |
6200c163ce7c513736c442afddfc5f9f
|
|
| BLAKE2b-256 |
5b90538f5d80be71b51957fff862478543c6c262915e5ceb72e179d3fb964ede
|