-
-
Notifications
You must be signed in to change notification settings - Fork 30.7k
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
3.11.1 Regression: namedtuple Enum values are cast to tuple #100098
Comments
…H-100099) When checking for auto() instances, only top-level usage is supported, which means either alone or as part of a regular tuple. Other containers, such as lists, dicts, or namedtuples, will not have auto() transformed into a value.
…uto (pythonGH-100099) When checking for auto() instances, only top-level usage is supported, which means either alone or as part of a regular tuple. Other containers, such as lists, dicts, or namedtuples, will not have auto() transformed into a value. (cherry picked from commit ded02ca) Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
…H-100099) When checking for auto() instances, only top-level usage is supported, which means either alone or as part of a regular tuple. Other containers, such as lists, dicts, or namedtuples, will not have auto() transformed into a value. (cherry picked from commit ded02ca) Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Thank you for the bug report. The fix will be in 3.11.2. If you need to use 3.11.1 you can inherit directly from >>> from enum import Enum
>>> from collections import namedtuple
>>> TTuple = namedtuple('TTuple', 'id a blist')
>>> class NTEnum(TTuple, Enum):
... NONE = TTuple(0, 0, [])
... A = TTuple(1, 2, [4])
... B = TTuple(2, 4, [0, 1, 2])
...
>>> NTEnum.A
<NTEnum.A: TTuple(id=1, a=2, blist=[4])>
>>>
>>> NTEnum.A.id
1
>>> NTEnum.B.blist
[0, 1, 2] On the up-side, the |
FYI, you can achieve equivalent functionality on python 3.11.1 for >>> from enum import Enum
>>> from dataclasses import dataclass
>>>
>>> @dataclass
... class TTuple:
... id: int
... a: int
... blist: list[int]
...
>>>
>>> class NTEnum(Enum):
... NONE = TTuple(0, 0, [])
... A = TTuple(1, 2, [4])
... B = TTuple(2, 4, [0, 1, 2])
...
>>> NTEnum.A
<NTEnum.A: TTuple(id=1, a=2, blist=[4])>
>>> NTEnum.A.value.id
1
>>> NTEnum.B.value.blist
[0, 1, 2] |
Access to the attributes of Enum was changed from field name to index due to a known issue on cpython as described in the following issue: python/cpython#100098
Bug report
Between 3.11.0 and 3.11.1, Enums whose values are namedtuple objects have their values converted to tuple, which drops the field names we expect to be able to use, causing AttributeErrors. Test cases below create a namedtuple and an enum whose values are instances of that tuple. In the 3.11.1 case, referencing the enum value like
NTEnum.NONE.value
produces a tuple and not a namedtuple. In both cases,copy.copy
preserves the namedtuple type.It is not clear whether any item in the changelog or release notes references this change, nor could I quickly tell whether this was related to changes to address #93910.
Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32
Python 3.11.1 (tags/v3.11.1:a7a450f, Dec 6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] on win32
Your environment
Linked PRs
The text was updated successfully, but these errors were encountered: