Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

enumhandler-0.2.0.tar.gz (6.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

enumhandler-0.2.0-py3-none-any.whl (7.5 kB view details)

Uploaded Python 3

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

Hashes for enumhandler-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a37c61e64763c631d6b3af3fcd5b6a6e54a8b53e5e3cb2743d0d864f5e63e9d7
MD5 52f1d95e914f99bfa5766e1faaa457f6
BLAKE2b-256 ceba50d93e6f14777cc4782e63cf565f9512da79faa98c39647c11cbdcc6924e

See more details on using hashes here.

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

Hashes for enumhandler-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 60c135dc29871972273394f34a3ee6ded76768af5675cedf26323f8bdf0cfd99
MD5 eb24e226eeecbc52d0f3315e4a3356b2
BLAKE2b-256 996222924efc16966c0a6c36f535c337b1f2637ea210aec4b10e0f0a0aea442a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page