【问题标题】:Specialized namespace enumeration专门的命名空间枚举
【发布时间】: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 真的是个好方法吗?

【问题讨论】:

标签: python python-3.x enums namespaces


【解决方案1】:

我不确定您要完成什么,原因如下:

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

以您尝试的方式使用Enum 的一个(大)困难是Enum 一旦成员存在就不允许子类化;换句话说,一旦您将MyBaseNs 创建为Enum,您将无法将MyChildNs 创建为Enum


就您的代码而言;运行时我得到这个:

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

这似乎正是您所要求的。

【讨论】:

  • 是的,我的代码是基本的,但它强制手动输入命名空间层次结构。我想让这个更有活力,以避免在重构的情况下忘记一些。这个命名空间和应用程序的命名空间是完全不同的。这就是为什么模块命名空间不是一个选项的原因。
  • @Spack: 你的MyBaseNsMyChildNs 都有相同的成员(ab)——这是故意的,还是只是一个坏例子?如果是故意的,并且子命名空间将具有相同的成员名称但不同的值,那么层次结构的意义何在?
猜你喜欢
  • 2016-12-03
  • 2011-10-28
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多