支持多个等效名称的枚举器类型
multienum的Python项目详细描述
支持多个等效名称的枚举类型。
基本原理
我发现在python 3的内置类型enum中定义的类型是 笨拙而难以用于我的目的。此外,我还有一个项目 反复要求我将字符串解析为数字,然后返回到 有时会根据上下文使用不同的字符串。这个模块是 结果。
实现子类int,它允许 枚举存储在最小空间中,同时提供 用于将对象转换为不同名称的属性数。
用法
子类应该将类属性_members定义为 元组。[1]_members的每个成员都应该是一个字符串元组 包含等同于枚举值的名称。价值将是 从成员在元组中的位置推断(等于 下标)。可选地,子类可以定义_fields,一个字段元组 与枚举名称在 _members属性。
枚举值可以用纯int值或 _members中提供的名称,可以使用适当的字段名作为 一个关键字,或者,只要它在所有字段中都是唯一的,作为一个非关键字 争论。没有测试来确保名称是唯一的——如果一个名称 在_members元组中多次出现,行为未定义。
默认情况下,如果 该值被转换为字符串(例如,使用str()函数)。为了 与enum模块中的类型兼容,相同的值将是 使用name属性返回。其他名称作为 如果定义了_names属性中的元组,则 可用作对应于相关字段名的属性值 在_fields中。
如果实例化时给定了多个参数,则无论是否为关键字, 除非所有参数都解析为 同样的价值。
类型MultiEnum尝试成为等幂的,即,如果x是 MultiEnum,x is MultiEnum(x)应该为真。但是,在本案中 在多个init值中,仅保留第一个值的幂等性。 位置参数。x is MultiEnum(a, x)将不是真的,即使 a和x相等。
[1] | Techincally, the ^{tt3}$ attribute, all members of ^{tt3}$, and the ^{tt5}$ attribute can be any iterable sequence. I strongly recommend tuples unless you have a reason not to, because in addition to being lightweight and simple, they’re immutable, which saves the interpreter a lot of work. |
示例
>>> from multienum import MultiEnum >>> class SampleEnum(MultiEnum): ... _members = (("zero", "zip", "zéro", "cero"), ... ("one", "ace", "une", "uno"), ... ("two", "deuce", "deux", "dos")) ... _fields = ('english', 'slang', 'french', 'spanish') >>> val1 = SampleEnum("one") >>> int(val1) 1 >>> str(val1) 'one' >>> val1.name 'one' >>> val1.spanish 'uno' >>> val2 = SampleEnum(slang="deuce") >>> int(val2) 2 >>> try: ... se = SampleEnum("two", spanish="cero") ... except ValueError: ... print("Value mismatch") Value mismatch