简单的枚举
项目描述
basicenum
简单的枚举。
basicenum.compat
从stdlib中重新实现(主要是API兼容性)的enum.Enum
(以及相关代码)。
此模块的目标是在尽可能使用现代Python特性的同时,重新实现尽可能多的enum.Enum
API。虽然这确实导致了一些API破坏(例如,type(enum.member) == type(enum)
不再为真),但它主要围绕元类级别的细节。如果您依赖于enum.Enum
的表面API,则此模块应该是兼容的。
API兼容性
使用枚举示例
class Colour(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
与enum.Enum
的兼容性是
功能 | 支持? |
---|---|
repr(Colour.RED) |
✅ |
str(Colour.RED) |
✅ |
type(Colour.RED) |
❌ (使用Member 代替) |
isinstance(Colour.RED, Colour) |
✅ |
iter(Colour) |
✅ |
hash(Colour.RED) |
✅ |
Colour(1) |
✅ |
Colour["RED"] |
✅ |
Colour.RED in Colour |
✅ |
Colour.RED.name |
✅ |
Colour.RED.value |
✅ |
auto() |
✅ |
_generate_next_value_() |
✅ |
Colour.__members__ |
✅ |
Colour.RED == Colour.RED |
✅ |
受限子类化 | ❌ |
序列化 | ✅ |
功能API | ✅ (通过create() ) |
类型检查
不幸的是,类型检查器硬编码了对enum.Enum
的支持。这意味着它们不会识别basicenum.compat.Enum
的成员作为Member
的实例或匹配enum.Enum
成员的API。
幸运的是,您可以欺骗类型检查器。您可以告诉它们在执行期间使用basicenum.compat
的同时,将类型检查作为使用enum
。
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from enum import Enum, auto
else:
from basicenum.compat import Enum, auto
基准测试
如果您安装了[benchmark]
扩展,您可以使用richbench
来查看enum
和basicenum.compat
之间的性能比较。
结果
在2015年早期发布的13英寸MacBook Pro(Retina)上
richbench --repeat 5 --times 5 --benchmark compat benchmarks/
基准 | 最小值 | 最大值 | 平均值 | 最小值 (+) | 最大值 (+) | 平均值 (+) |
---|---|---|---|---|---|---|
导入 | 0.374 | 0.503 | 0.422 | 0.117 (3.2倍) | 0.120 (4.2倍) | 0.119 (3.5倍) |
使用 auto() 创建 |
0.422 | 0.429 | 0.425 | 0.075 (5.7倍) | 0.077 (5.5倍) | 0.076 (5.6倍) |
_generate_next_value_() |
0.373 | 0.383 | 0.376 | 0.077 (4.8倍) | 0.078 (4.9倍) | 0.078 (4.8倍) |
使用常量创建 | 0.333 | 0.351 | 0.339 | 0.060 (5.5倍) | 0.066 (5.4倍) | 0.063 (5.4倍) |
功能API | 0.392 | 0.397 | 0.394 | 0.070 (5.6倍) | 0.074 (5.4倍) | 0.072 (5.5倍) |
检查类型是否为 Enum | 0.189 | 0.191 | 0.190 | 0.279 (-1.5倍) | 0.282 (-1.5倍) | 0.280 (-1.5倍) |
迭代 Enum |
0.912 | 0.922 | 0.917 | 0.197 (4.6倍) | 0.199 (4.6倍) | 0.198 (4.6倍) |
创建 Enum(...) |
0.297 | 0.297 | 0.297 | 0.078 (3.8倍) | 0.079 (3.8倍) | 0.078 (3.8倍) |
创建 Enum[...] |
0.121 | 0.122 | 0.121 | 0.075 (1.6倍) | 0.139 (-1.1倍) | 0.093 (1.3倍) |
... 在 Enum 中 |
0.267 | 0.375 | 0.308 | 0.162 (1.6倍) | 0.164 (2.3倍) | 0.163 (1.9倍) |
成员访问 | 0.333 | 0.337 | 0.334 | 0.118 (2.8倍) | 0.121 (2.8倍) | 0.119 (2.8倍) |
值访问 | 0.735 | 0.761 | 0.744 | 0.141 (5.2倍) | 0.143 (5.3倍) | 0.142 (5.2倍) |
相等 | 0.343 | 0.345 | 0.344 | 0.103 (3.3倍) | 0.107 (3.2倍) | 0.105 (3.3倍) |
repr | 0.379 | 0.386 | 0.382 | 0.236 (1.6倍) | 0.238 (1.6倍) | 0.237 (1.6倍) |
哈希 | 0.345 | 0.355 | 0.348 | 0.245 (1.4倍) | 0.250 (1.4倍) | 0.247 (1.4倍) |
序列化 | 0.270 | 0.272 | 0.271 | 0.270 (-1.0倍) | 0.274 (-1.0倍) | 0.272 (-1.0倍) |
反序列化 | 0.229 | 0.232 | 0.231 | 0.230 (-1.0倍) | 0.232 (-1.0倍) | 0.231 (-1.0倍) |
__members__ |
0.373 | 0.381 | 0.376 | 0.046 (8.1倍) | 0.047 (8.1倍) | 0.046 (8.1倍) |
@unique |
0.518 | 0.523 | 0.520 | 0.104 (5.0倍) | 0.109 (4.8倍) | 0.106 (4.9倍) |
模块内容
Enum
创建枚举的基类。
Member
所有枚举成员的实例所属的类。
auto()
自动、递增整数成员值的函数。
@unique
确保所有枚举成员都有唯一值。
如果值不是全部唯一的,将引发 ValueError
。
create()
对 enum.Enum
的功能API的重新实现。
def create(
enum_name, member_names, /, *, module=None, qualname=None, type=None, start=1
): ...
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
basicenum-2023.1.tar.gz (6.8 kB 查看哈希)
构建分布
basicenum-2023.1-py3-none-any.whl (6.8 kB 查看哈希)