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

Unexpected behavior change in subclassing Enum class as of 3.11 #103479

Closed
sadra-barikbin opened this issue Apr 12, 2023 · 1 comment
Closed

Unexpected behavior change in subclassing Enum class as of 3.11 #103479

sadra-barikbin opened this issue Apr 12, 2023 · 1 comment
Assignees
Labels
docs Documentation in the Doc dir

Comments

@sadra-barikbin
Copy link
Contributor

sadra-barikbin commented Apr 12, 2023

I had a question regarding changes in subclassing Enum in 3.11. As of 3.11, if enum class has a mixin parent apart from Enum which has defined __init__ or __new__, member._value_ is set to be another instance of the mixin class
unless user defines __new__ in the enum class and set _value_. However user naturally expects _value_ to be the value assigned to the member in class definition. In the example below

class mixin:
  def __init__(self):
    pass

class CustomEnum(mixin, Enum):
  MEMBER = "member"

CustomEnum.MEMBER is an instance of mixin and CustomEnum.MEMBER.value is another instance of it (with different id), while it was expected that CustomEnum.MEMBER.value would be "member". What has been the rationale for this change?

By the way, this change is not noted in python docs enumeration page.

Linked PRs

@ethanfurman ethanfurman self-assigned this Apr 12, 2023
@arhadthedev arhadthedev added the docs Documentation in the Doc dir label Apr 12, 2023
ethanfurman added a commit that referenced this issue Apr 13, 2023
…3495)

a mixin must either have a __new__ method, or be a dataclass, to be interpreted as a data-type
ethanfurman added a commit to ethanfurman/cpython that referenced this issue Apr 13, 2023
…ta type (pythonGH-103495)

a mixin must either have a __new__ method, or be a dataclass, to be interpreted as a data-type.
                    (cherry picked from commit a6f9594)

                    Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
carljm added a commit to carljm/cpython that referenced this issue Apr 13, 2023
* main:
  pythongh-103479: [Enum] require __new__ to be considered a data type (pythonGH-103495)
  pythongh-103365: [Enum] STRICT boundary corrections (pythonGH-103494)
  pythonGH-103488: Use return-offset, not yield-offset. (pythonGH-103502)
  pythongh-103088: Fix test_venv error message to avoid bytes/str warning (pythonGH-103500)
  pythonGH-103082: Turn on branch events for FOR_ITER instructions. (python#103507)
  pythongh-102978: Fix mock.patch function signatures for class and staticmethod decorators (python#103228)
  pythongh-103462: Ensure SelectorSocketTransport.writelines registers a writer when data is still pending (python#103463)
  pythongh-95299: Rework test_cppext.py to not invoke setup.py directly (python#103316)
ethanfurman added a commit that referenced this issue Apr 13, 2023
…GH-103495) (GH-103514)

a mixin must either have a __new__ method, or be a dataclass, to be interpreted as a data-type; an __init__ method is not enough (restores pre-3.11 behavior for non-dataclasses).

(cherry picked from commit a6f9594)
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
@ethanfurman
Copy link
Member

Thank you for the bug report; this is now fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docs Documentation in the Doc dir
Projects
None yet
Development

No branches or pull requests

3 participants