【发布时间】:2016-06-20 03:31:51
【问题描述】:
我想利用 Python 的 enum 在自己的命名空间中创造价值。
基本思路如下:
from enum import Enum
class MyBaseNs(Enum):
__namespace__ = 'base'
a = 'a'
b = 'b'
class MyChildNs(MyBaseNs):
__namespace__ = 'child'
a = 'a'
b = 'b'
然后每个成员应该打印以下内容:
>>> MyBaseNs.a.value
'base.a'
>>> MyBaseNs.b.value
'base.b'
>>> MyChildNs.a.value
'base.child.a'
>>> MyChildNs.a.value
'base.child.b'
理想情况下,我希望直接从成员名称中获取值,这样我就可以避免重复,例如 Autoumber class 给出的示例。
奖励将是能够做类似的事情:
>>> MyBaseNs.child.a.value
'base.child.a'
我开始使用__new__() 方法,但很难达到预期的结果。
现在我有以下内容:
from enum import Enum
class MyNs(str, Enum):
__sep__ = '.'
def __new__(cls, value):
obj = str.__new__(cls)
obj._value_ = cls.__sep__.join(cls.__namespace__ + (str(value), ))
return obj
class A(MyNs):
__namespace__ = ('a', )
a = 'a'
因此,这将创建一个 str 专用 Enum 并将每个成员值加入 __namespace__ 元组。所以这就是我正在寻找的基础知识。
该解决方案意味着运行当前命名空间的所有父级以创建最终的__namespace__ 元组。我现在不明白如何做到这一点。
如何实现这样的行为? Enum 真的是个好方法吗?
【问题讨论】:
-
“很难” 不是一个有用的问题描述;请给minimal reproducible example。
标签: python python-3.x enums namespaces