A class that allows the definition of handlers for an enum class, along withdefinition-time type and exhaustivity checks.
Project description
EnumHandler
If you're like me, you were disappointed to see that structural pattern matching (PEP 622) landed in Python without any of the proposed exhaustiveness guarantees (PEP 634).
Although match and case are still useful, exhaustive matching over an enum is a comfortable idiom in other languages, and I was looking forward to first-class treatment of this in Python.
Worse, I ended up writing a number of repetitive exhaustiveness tests:
import pytest
from myproject import Colors, name_of_color
@pytest.parametrize(MyEnum)
def test_name_of_color_exhaustiveness(value):
assert name_of_color(value)
Tests that don't care about the return value of the function under test are a hallmark of type system failures.
This library fixes that by providing a base class for classes that exhaustively cover an enumeration.
Upon class definition, EnumHandler will validate the exhaustiveness and uniqueness of handlers registered on any subclass using the EnumHandler.register decorator.
from enum import Enum, auto
from enumhandler import EnumHandler, handles
class Colors(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
class NameOfColor(EnumHandler, enum=Colors):
@handles(Colors.RED)
def red(self) -> str:
return "Red"
@handles(Colors.GREEN)
def green(self) -> str:
return "Green"
@handles(Colors.BLUE)
def blue(self) -> str:
return "Blue"
The class is instantiated with a member of the enum, and the resulting instance is callable:
>>> print(NameOfColor(Colors.RED)())
Red
An InvalidEnumHandler exception is raised in three cases:
- Not all enum values are handled.
- One enum value has multiple registered handlers.
- A handler is registered for the incorrect enum.
- A handler is registered on an existing class.
Please note that subclassing is currently not supported.
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 enumhandler-0.2.0.tar.gz.
File metadata
- Download URL: enumhandler-0.2.0.tar.gz
- Upload date:
- Size: 6.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a37c61e64763c631d6b3af3fcd5b6a6e54a8b53e5e3cb2743d0d864f5e63e9d7
|
|
| MD5 |
52f1d95e914f99bfa5766e1faaa457f6
|
|
| BLAKE2b-256 |
ceba50d93e6f14777cc4782e63cf565f9512da79faa98c39647c11cbdcc6924e
|
File details
Details for the file enumhandler-0.2.0-py3-none-any.whl.
File metadata
- Download URL: enumhandler-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60c135dc29871972273394f34a3ee6ded76768af5675cedf26323f8bdf0cfd99
|
|
| MD5 |
eb24e226eeecbc52d0f3315e4a3356b2
|
|
| BLAKE2b-256 |
996222924efc16966c0a6c36f535c337b1f2637ea210aec4b10e0f0a0aea442a
|