Skip to content

Using NamedTuple with custom Enum #114149

Closed
Closed
@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 fixesstdlibPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions