保留字作为枚举成员

时间:2018-12-15 09:20:39

标签: python python-3.x enums reserved-words reserved

我想制作一个具有保留字作为成员的python枚举。

class Test(Enum):

    one = "one"
    is_ = "is"

我想自定义__name__以返回通常的语法

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

那我该如何自定义__name____getattribute____getattr__来做到这一点?

2 个答案:

答案 0 :(得分:2)

它存储在单个下划线变量中:

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

这也可以修复代表的问题,按成员值进行的呼叫仍然有效:

>>> 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'>

如果您在这里不仅需要一个简单的别名,那么您可能想要删除原始名称和/或注意保留成员映射中的顺序。

答案 1 :(得分:1)

您可以使用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'>]