为autovalues创建一个StringAutoEnum类,其语法简洁明了

2024-10-08 18:31:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个StringAutoEnum类,它可以将其成员值设置为成员名称的小写版本,而不必为每个值调用auto(),因为这太冗长了,我根本不喜欢它

假设这个基类StringAutoEnum

import aenum

class StringAutoEnum(aenum.Enum):
    def _generate_next_value_(name, start, count, last_values):
        return name.lower()

理想情况如下:

class Animal(StringAutoEnum):
    DOG, CAT, SNAKE

使以下情况成立:

Animal.DOG.value == "dog"
Animal.CAT.value == "cat"
Animal.SNAKE.value == "snake"

显然,上面的类定义甚至不是有效的python代码(除非已经预先定义了DOG、CAT和SNAKE),所以这样做(据我所知)是不可能的

因此,我考虑了以下几种备选方案:

多变量赋值:

class Animal(StringAutoEnum):
    DOG = CAT = SNAKE = auto()

可拆箱:

class Animal(StringAutoEnum):
    DOG, CAT, SNAKE = auto()

重申一下,我不想这样做:

class Animal(StringAutoEnum):
    DOG, CAT, SNAKE = auto(), auto(), auto()

我也不想使用函数API

赋值给多个变量的问题似乎是auto()只对第一个变量名求值一次,因此枚举的所有3个成员都以名称“DOG”和值“DOG”结束。我还没找到解决办法

iterable解包的问题是,我想不出任何方法来提前知道赋值运算符左侧有多少个变量

这意味着,虽然这将工作,并将完全做我想要的:

class Auto(aenum.auto):
    def __iter__(self):
        return iter([Auto() for _ in range(3)])

class Animal(StringAutoEnum):
    DOG, CAT, SNAKE = Auto()

不幸的是,这不会:

class Animal(StringAutoEnum):
    DOG, CAT, SNAKE, EMU = Auto()

我想不出任何方法来解决这个问题,对于分配给任意数量的成员

有没有人能想出一种简洁明了的方法来解决这个问题?或者,有人能提出一个可行的多变量赋值实现方案吗

提前谢谢


Tags: 方法名称autovaluedef成员classcat
1条回答
网友
1楼 · 发布于 2024-10-08 18:31:17

因为您使用的是^{},所以您可以选择AutoEnum,它完全包含了元类的魔力:

from aenum import AutoEnum

class StringAutoEnum(AutoEnum):
    #
    def _generate_next_value_(name, start, count, last_values):
        return name.lower()

class Animal(StringAutoEnum):
    DOG, CAT, SNAKE

 > list(Animal)
[<Color.Dog: 'dog'>, <Color.CAT: 'cat'>, <Color.SNAKE: 'snake'>]

如果这太神奇了,那么下一个最佳解决方案就是对每个值使用auto()(或者使用函数API)

相关问题 更多 >

    热门问题