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

Enum with str or int Mixin Breaking Change in Python 3.11 #100458

Open
anze3db opened this issue Dec 23, 2022 · 4 comments
Open

Enum with str or int Mixin Breaking Change in Python 3.11 #100458

anze3db opened this issue Dec 23, 2022 · 4 comments
Assignees
Labels
3.11 bug and security fixes docs Documentation in the Doc dir type-bug An unexpected behavior, bug, or error

Comments

@anze3db
Copy link

anze3db commented Dec 23, 2022

Bug report

Looks like there was a breaking change with the way str and int mixins work with Enums in Python 3.11:

from enum import Enum


class Foo(str, Enum):
    BAR = "bar"

# Python 3.10
f"{Foo.BAR}"  # > bar

# Python 3.11
f"{Foo.BAR}"  # > Foo.BAR

The same goes for Enum classes with the int mixin.

In my project we were relying on Foo.BAR to return the enum value, so this change broke our code. We fixed it by replacing str Enum mixin with the newly added StrEnum class (thanks for that, it's exactly what we needed!).

I think reverting the breaking change would only introduce another breaking change so that's probably not the way to go. But maybe updating the whatsnew page and call out the change there could help people stumbling into this when doing the upgrade. I've found the existing point about this change in the release notes a little bit confusing and I have already opened a PR to try and clear it up a bit: #100387

I've also written a longer blog post about it here, and there has been some lively discussion in r/python.

Your environment

  • CPython versions tested on: 3.11.0, 3.11.1
  • Operating system and architecture: MacOS, Ubuntu 22.04

Linked PRs

@anze3db anze3db added the type-bug An unexpected behavior, bug, or error label Dec 23, 2022
@AlexWaygood AlexWaygood added docs Documentation in the Doc dir 3.11 bug and security fixes labels Dec 23, 2022
@JosephSBoyle
Copy link
Contributor

JosephSBoyle commented Dec 25, 2022

@anze3db StrEnum was added in 3.11, does that work as a 'slot in' replacement for your use case?

docs: https://docs.python.org/3.11/library/enum.html#enum.StrEnum

@anze3db
Copy link
Author

anze3db commented Dec 27, 2022

@JosephSBoyle yes, we replaced the str mixin with StrEnum to fix this on our end. If we could let people know about this breaking change in the what's new docs it would save me a lot of head scratching, especially since the current note about this change seems wrong (see my attempt of at least making it a bit more accurate: #100387)

@JosephSBoyle
Copy link
Contributor

Coincidentally I've also used the mixin approach you describe in professional projects, which suggests that this use is at the very least not uncommon.

As such it makes sense that the docs also suggest a way to achieve the old behaviour, like you say @anze3db. I've added a small suggestion to your PR; hopefully that will help resolve things for others in the same position!

@anze3db
Copy link
Author

anze3db commented Dec 27, 2022

Thank you! The text that you added would have helped me a lot when I was figuring out how to fix this 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.11 bug and security fixes docs Documentation in the Doc dir type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

4 participants