Issue 31587: Enum doesn't allow name (original) (raw)
Enum module handles "name" member incorrectly.
- "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 "", line 2, in 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
- 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
It turns out that enum34 backports module was the culprit (it was first on search path). When using enum native module, everything works as expected:
c:\Python\Python36-32\python.exe -I Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information.
import enum enum <module 'enum' from 'c:\Python\Python36-32\lib\enum.py'> @enum.unique ... class A(enum.IntEnum): ... a = 1 ... name = 2 ... value = 3 ... exit()
c:\Python\Python36-32\python.exe Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information.
import enum enum <module 'enum' from 'C:\Python27\Lib\site-packages\enum\_init__.py'> @enum.unique ... class A(enum.IntEnum): ... a = 1 ... name = 2 ... value = 3 ... Traceback (most recent call last): File "", line 2, in 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, value -> A.name
Sorry for the noise.