我想制作一个具有保留字作为成员的python枚举。
class Test(Enum):
one = "one"
is_ = "is"
我想自定义__name__
以返回通常的语法
>>> print(Test.is_.name)
is
那我该如何自定义__name__
,__getattribute__
或__getattr__
来做到这一点?
答案 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'>]