Зарезервированное слово как член enum - PullRequest
0 голосов
/ 15 декабря 2018

Я хотел, чтобы Pyum Enum работал с зарезервированным словом в качестве члена.

class Test(Enum):

    one = "one"
    is_ = "is"

Я хотел настроить __name__ для получения обычного синтаксического возврата

>>> print(Test.is_.name)
is

Так как мне настроить __name__, __getattribute__ или __getattr__ для достижения этой цели??

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вместо того, чтобы дурачиться с внутренностями, вы можете использовать Functional API вместо:

Test = Enum('Test', [('one', 'one'), ('is', 'is'), ('is_', 'is')])

и использовать:

>>> Test.one
<Test.one: 'one'>

>>> Test.is
  File "<stdin>", line 1
    test.is
          ^
SyntaxError: invalid syntax

>>> Test.is_
<Test.is: 'is'>

>>> Test['is']
<Test.is: 'is'>

>>> Test['is_']
<Test.is: 'is'>

>>> Test('is')
<Test.is: 'is'>

>>> list(Test)
[<Test.one: 'one'>, <Test.is: 'is'>]
0 голосов
/ 15 декабря 2018

Хранится в переменной , подчеркивание :

>>> Test.is_._name_ = 'is'                                                                                                                                       
>>> Test.is_.name                                                                                                                                                
'is'

Это также исправит значение repr, и вызов по значению по-прежнему работает:

>>> list(Test)                                                                                                                                                   
[<Test.one: 'one'>, <Test.is: 'is'>]
>>> Test('is')                                                                                                                                                   
<Test.is: 'is'>

Конечно, для доступа к атрибуту все равно придется использовать объявленное имя, потому что в противном случае это будет синтаксическая ошибка.

Чтобы разрешить вызов по имени члена, вставьте его в карту:

>>> Test.is_._name_ = 'is'                                                                                                                                       
>>> Test._member_map_['is'] = Test.is_                                                                                                                           
>>> Test['is']                                                                                                                                                   
<Test.is: 'is'>

Если вам нужно больше, чем простой псевдоним, вы можете удалить исходное имя и / или позаботиться о сохранении порядка в карте участников.

...