Skip to content

enum.global_enum: cls_name undefined in global_str #93100

Closed
@The-Compiler

Description

@The-Compiler

Bug report

In acf7403 (#30582), @ethanfurman implemented a global_enum decorator, replacing the __str__ of an enum with enum.global_str:

cpython/Lib/enum.py

Lines 1638 to 1645 in 760ec89

def global_str(self):
"""
use enum_name instead of class.enum_name
"""
if self._name_ is None:
return "%s(%r)" % (cls_name, self._value_)
else:
return self._name_

(This was later reverted in 42a64c0 and reintroduced in 83d544b, but I believe the code to be the same).

If the ._name_ attribute is None, this uses cls_name, but that's not defined anywhere in that function!

Here is a (somewhat contrived) example:

import enum

@enum.global_enum
class EnumTest(enum.Enum):
    VAL = 1

EnumTest.VAL._name_ = None

print(str(VAL))

this fails with:

Traceback (most recent call last):
  File "/home/florian/tmp/x.py", line 9, in <module>
    print(str(VAL))
          ^^^^^^^^
  File "/usr/lib/python3.11/enum.py", line 1646, in global_str
    return "%s(%r)" % (cls_name, self._value_)
                       ^^^^^^^^
NameError: name 'cls_name' is not defined

(Found by running flake8 over Lib/ out of curiosity, see #93010 (comment))

Your environment

  • CPython versions tested on: Python 3.11.0b1
  • Operating system and architecture: Archlinux x86_64

Metadata

Metadata

Assignees

Labels

3.11only security fixes3.12only 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