[New-bugs-announce] [issue31587] Enum doesn't allow name

Robert Gomułka report at bugs.python.org
Tue Sep 26 02:58:17 EDT 2017


New submission from Robert Gomułka:

Enum module handles "name" member incorrectly.
1. "name" can't be used as a member when decorated with unique:

>>> import enum
>>> @enum.unique
... class A(enum.IntEnum):
...     a = 1
...     name = 2
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Python27\Lib\site-packages\enum\__init__.py", line 835, in unique
    (enumeration, duplicate_names)
ValueError: duplicate names found in <enum 'A'>: a -> A.name, name -> A.name

2. Without unique the names are assigned incorrectly:

>>> class A(enum.IntEnum):
...     a = 1
...     name = 2
...
>>> A.__members__['a'].name
<A.name: 2>
>>> A.__members__['name'].name
<A.name: 2>

(Just for reference - spotted first on Python 2.7 + enum34 backports)

The same happens for value property, making the bug quite severe:

>>> class A(enum.IntEnum):
...     a = 1
...     value = 3
...
>>> A.__members__['a'].value
<A.value: 3>
>>> A.__members__['value'].value
<A.value: 3>

I believe this comment is related:
# _RouteClassAttributeToGetattr is used to provide access to the `name`
# and `value` properties of enum members while keeping some measure of
# protection from modification, while still allowing for an enumeration
# to have members named `name` and `value`.  This works because enumeration
# members are not set directly on the enum class -- __getattr__ is
# used to look them up.


Platform: Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32

----------
components: Library (Lib)
messages: 303017
nosy: Robert Gomułka
priority: normal
severity: normal
status: open
title: Enum doesn't allow name
type: behavior
versions: Python 3.6

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue31587>
_______________________________________


More information about the New-bugs-announce mailing list