我正在尝试实现一个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()
我想不出任何方法来解决这个问题,对于分配给任意数量的成员
有没有人能想出一种简洁明了的方法来解决这个问题?或者,有人能提出一个可行的多变量赋值实现方案吗
提前谢谢
因为您使用的是^{} ,所以您可以选择
AutoEnum
,它完全包含了元类的魔力:如果这太神奇了,那么下一个最佳解决方案就是对每个值使用
auto()
(或者使用函数API)相关问题 更多 >
编程相关推荐