基本上我需要以下。我有一个python3dataclass或NamedTuple,只有enum
和bool
字段。例如:
from enum import Enum, auto
from typing import NamedTuple
class MyEnum(Enum):
v1 = auto()
v2 = auto()
v3 = auto()
class MyStateDefinition(NamedTuple):
a: MyEnum
b: bool
这里有什么好的解决方案可以枚举这样一个数据类的所有可能的不相等实例吗(上面的示例有6个可能的不相等实例)
也许我不应该使用dataclass
,而是其他东西。或者我应该直接玩像^{
我把它想象成某种表生成器,它接受namedtuple
或dataclass
作为输入参数,并生成所有可能的值
table = DataTable(MyStateDefinition)
for item in table:
# Use items somehow
print(item.a)
print(item.b)
为什么我需要它?我只是有一些由枚举和布尔组成的状态定义。我相信它可以实现为位掩码。但是当涉及到用新值扩展你的位掩码时,它变成了一场噩梦。毕竟,比特面具似乎是一种非Python式的做事方式
目前,我必须使用自己的实现。但也许我正在重新发明轮子
谢谢
也张贴了我自己的实现。不太理想,我不得不使用一些受保护的成员
用法:
有关更多用法示例,请参见
test_datatable.py
、_test_cls
datatable.py
测试数据表.py
您可以使用enum执行此操作,数据元组作为enum成员的值(如果愿意,可以使用
Enum
/NamedTuple
混合体)。_ignore_
属性用于防止类命名空间中的某些名称转换为枚举成员您应该能够按照自己的意愿迭代生成的枚举类
枚举的这种使用类似于文档的enumhowto部分中的"time period" example
动态生成此类表
如果您想动态生成此类表,可以使用元类执行如下操作(ab)。我已经展示了如何在docstrings中使用这个
DataTable
类的示例用法。(出于某种原因,在doctest中使用typing.get_type_hints
似乎会导致doctest
模块出错,但如果您自己在交互式终端中尝试这些示例,它们确实可以工作。)与您在回答中使用的特殊大小写bool
不同,我决定使用特殊大小写typing.Literal
,因为它似乎是一个更可扩展的选项(和bool
可以拼写为typing.Literal[True, False]
)我不得不用类型提示做一些“有趣”的事情,但MyPy对所有这些都很在行
相关问题 更多 >
编程相关推荐