Issue 31587: Enum doesn't allow name (original) (raw)

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 "", 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

  1. 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.