Python中的枚举枚举?

列奥诺拉·廷德尔

Python中是否可以有枚举枚举?例如,我想要

enumA
    enumB
        elementA
        elementB
    enumC
        elementC
        elementD

对我来说可以elementA称为enumA.enumB.elementAelementD称为enumA.enumC.elementD

这可能吗?如果是这样,怎么办?

编辑:以幼稚的方式实现时:

from enum import Enum

class EnumA(Enum):
    class EnumB(Enum):
        member = 0

print(EnumA)
print(EnumA.EnumB.member)

它给:

<enum 'EnumA'>
Traceback (most recent call last):
  File "Maps.py", line 15, in <module>
    print(EnumA.EnumB.member)
AttributeError: 'EnumA' object has no attribute 'member'
阿巴内特

您无法使用enumstdlib模块执行此操作如果您尝试:

class A(Enum):
    class B(Enum):
        a = 1
        b = 2
    class C(Enum):
        c = 1
        d = 2

A.B.a

…您将得到一个类似的异常:

AttributeError: 'A' object has no attribute 'a'

这是因为的枚举值的A行为类似于的实例A,而不是其值类型的实例。就像持有int的普通枚举在值上没有int方法一样,B不会有Enum方法。相比:

class D(Enum):
    a = 1
    b = 2

D.a.bit_length()

当然,您可以显式访问基础值(intB类):

D.a.value.bit_length()
A.B.value.a

…但是我怀疑那是您想要的。


因此,您是否可以使用相同的技巧来IntEnum对这两者进行子类化,Enumint使其枚举值成为 int值,如文档的“其他”部分中所述?

不,因为您将继承哪种类型?Enum; 那已经是你的类型了。您不能使用type(任意类的类型)。没有任何工作。

因此,您必须使用具有不同设计的其他Enum实现来完成此工作。幸运的是,PyPI和ActiveState上大约有69105个不同的选项可供选择。


例如,当我要构建类似于Swift枚举的东西(比Python / Java / etc。枚举更接近ML ADT)时,有人建议我看一下makeobj我忘记这样做了,但是现在我只是这样做了,并且:

class A(makeobj.Obj):
    class B(makeobj.Obj):
        a, b = makeobj.keys(2)
    class C(makeobj.Obj):
        c, d = makeobj.keys(2)

print(A.B, A.B.b, A.B.b.name, A.B.b.value)

这给您:

<Object: B -> [a:0, b:1]> <Value: B.b = 1> b 1

如果查看它__qualname__而不是查看__name__来创建str / repr值,则可能会很好,但否则看起来它就可以满足您的所有要求。而且它还有其他一些很酷的功能(不完全是我想要的,但是很有趣……)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章