作为枚举成员的保留字

Reserved word as member of enum

我想制作一个 python 枚举作品,其中包含一个保留字作为成员。

class Test(Enum):

    one = "one"
    is_ = "is"

我想自定义 __name__ 以使用通常的语法 return

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

那么我该如何自定义 __name____getattribute____getattr__ 来完成此操作?

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

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

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

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