Enum KeyError Function - PullRequest
       4

Enum KeyError Function

0 голосов
/ 07 мая 2018

Я пытаюсь получить доступ к функции, хранящейся в Enum, используя ее имя, но я получаю KeyError:

from enum import Enum

def f():
    pass

class MyEnum(Enum):
   function = f

print MyEnum.function  # <unbound method MyEnum.f>
print MyEnum['function']  # KeyError: 'function'

Но это работает, если Enum не хранит func:

from enum import Enum

class MyEnum(Enum):
   a = "toto"

print MyEnum.a  # MyEnum.a
print MyEnum.a.value  # "toto"
print MyEnum['a']  # MyEnum.a
print MyEnum.a.value  # "toto"

Я знаю, что мог бы использовать dict вместо Enum, но я хочу знать, почему Enum ведет себя по-другому.

1 Ответ

0 голосов
/ 07 мая 2018

Назначение функции аналогично ее определению.И если вы определяете функцию в Enum, она становится методом Enum и не принимается в качестве значения для перечисления.

Следующие перечисления A и B полностью эквивалентны:

>>> from enum import Enum
>>> 
>>> class A(Enum):
...     a = 1
...     def f(self):
...         print('Hello')
... 
>>> def x(self):
...     print('Hello')
... 
>>> class B(Enum):
...     a = 1
...     f = x
... 
>>> B.f
<unbound method B.x>
>>> A.f
<unbound method A.f>
>>> A['a']
<A.a: 1>
>>> A['f']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/enum/__init__.py", line 384, in __getitem__
    return cls._member_map_[name]
KeyError: 'f'
>>> B['a']
<B.a: 1>
>>> B['f']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/enum/__init__.py", line 384, in __getitem__
    return cls._member_map_[name]
KeyError: 'f'

Функции обрабатываются по-разному, потому что в противном случае было бы невозможно определить пользовательские методы в перечислении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...