Skip to content

Using NamedTuple with custom Enum #114149

@SultanOrazbayev

Description

@SultanOrazbayev

Documentation

This issue is related to #114071 and @ethanfurman suggested creating an isolated issue:

The handling of NamedTuple with a custom Enum is unexpected. Here are two examples that seek to achieve the same thing, but one will fail when using NamedTuple.

Using dataclasses (works):

from dataclasses import dataclass from enum import Enum @dataclass class CodeLabel: code: int label: str class LabelledEnumMixin: labels = {} def __new__(cls, codelabel: CodeLabel): member = object.__new__(cls) member._value_ = codelabel.code member.label = codelabel.label cls.labels[codelabel.code] = codelabel.label return member @classmethod def list_labels(cls): return list(l for c, l in cls.labels.items()) class Test(LabelledEnumMixin, Enum): A = CodeLabel(1, "Label A") B = CodeLabel(2, "Custom B") C = CodeLabel(3, "Custom label for value C + another string") Test.list_labels()

Using NamedTuple (fails):

from typing import NamedTuple from enum import Enum class CodeLabel(NamedTuple): code: int label: str class LabelledEnumMixin: labels = {} def __new__(cls, codelabel: CodeLabel): member = object.__new__(cls) member._value_ = codelabel.code member.label = codelabel.label cls.labels[codelabel.code] = codelabel.label return member @classmethod def list_labels(cls): return list(l for c, l in cls.labels.items()) class Test(LabelledEnumMixin, Enum): A = CodeLabel(1, "Label A") B = CodeLabel(2, "Custom B") C = CodeLabel(3, "Custom label for value C + another string") Test.list_labels()

Linked PRs

Metadata

Metadata

Assignees

Labels

3.11only security fixes3.12only security fixes3.13bugs and security fixesstdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions