Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-38659: [Enum] add _simple_enum decorator #25497

Merged
merged 7 commits into from Apr 21, 2021

Conversation

ethanfurman
Copy link
Member

@ethanfurman ethanfurman commented Apr 21, 2021

add:

  • _simple_enum decorator to transform a normal class into an enum
  • _test_simple_enum function to compare
  • _old_convert_ to enable checking _convert_ generated enums

_simple_enum takes a normal class and converts it into an enum:

@simple_enum(Enum)
class Color:
    RED = 1
    GREEN = 2
    BLUE = 3

_old_convert_ works much like _convert_ does, using the original logic:

# in a test file
import socket, enum
CheckedAddressFamily = enum._old_convert_(
        enum.IntEnum, 'AddressFamily', 'socket',
        lambda C: C.isupper() and C.startswith('AF_'),
        source=_socket,
        )

_test_simple_enum takes a traditional enum and a simple enum and
compares the two:

# in the REPL or the same module as Color
class CheckedColor(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

_test_simple_enum(CheckedColor, Color)

_test_simple_enum(CheckedAddressFamily, socket.AddressFamily)

Any important differences will raise a TypeError

https://bugs.python.org/issue38659

ethanfurman added 6 commits Apr 21, 2021
Instead of raising ValueError on mismatch, raise a TypeError instead.
- make simple_enum and test_simple_enum private
- add _old_convert_ to enable testing `IntEnum._convert_`
  and `IntFlag._convert_` transformations
- add tests for the `_convert_`s
@ethanfurman ethanfurman merged commit a02cb47 into python:master Apr 21, 2021
12 of 13 checks passed
@ethanfurman ethanfurman deleted the enum-simple branch Apr 21, 2021
pablogsal added a commit to pablogsal/cpython that referenced this pull request Apr 23, 2021
kreathon pushed a commit to kreathon/cpython that referenced this pull request May 2, 2021
add:

* `_simple_enum` decorator to transform a normal class into an enum
* `_test_simple_enum` function to compare
* `_old_convert_` to enable checking `_convert_` generated enums

`_simple_enum` takes a normal class and converts it into an enum:

    @simple_enum(Enum)
    class Color:
        RED = 1
        GREEN = 2
        BLUE = 3

`_old_convert_` works much like` _convert_` does, using the original logic:

    # in a test file
    import socket, enum
    CheckedAddressFamily = enum._old_convert_(
            enum.IntEnum, 'AddressFamily', 'socket',
            lambda C: C.isupper() and C.startswith('AF_'),
            source=_socket,
            )

`_test_simple_enum` takes a traditional enum and a simple enum and
compares the two:

    # in the REPL or the same module as Color
    class CheckedColor(Enum):
        RED = 1
        GREEN = 2
        BLUE = 3

    _test_simple_enum(CheckedColor, Color)

    _test_simple_enum(CheckedAddressFamily, socket.AddressFamily)

Any important differences will raise a TypeError
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants