专门的命名空间枚举

时间:2016-03-06 16:14:21

标签: python python-3.x enums namespaces

我想利用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真的是最好的方式吗?

1 个答案:

答案 0 :(得分:0)

我不确定你想要完成什么,这就是原因:

  • 每个模块都已有自己的命名空间
  • 每个类都已经是自己的命名空间
  • 许多其他东西也已经是命名空间

在你尝试的方式中使用Enum的一个(大)难点是Enum一旦成员存在就不允许继承子类;换句话说,一旦您将MyBaseNs创建为Enum,就不允许您将MyChildNs创建为Enum

至于你的代码;跑步的时候我明白了:

>>> A
<enum 'A'>
>>> A.a
<A.a: 'a.a'>

这似乎正是你所要求的。