添加打字功能的python包“construct”的扩展
项目描述
构造类型
这个项目是 python 包结构的扩展,它是一个强大的声明性和对称的二进制数据解析器和构建器。该存储库由两个包组成:
- 构造存根:为整个构造 2.10包添加 .pyi(根据 PEP 561 存根包)
- constructor_typed:添加有助于自动完成和附加类型提示的附加类。
安装
此软件包符合PEP 561。所以大多数静态代码分析器会自动识别存根。安装只需要:
pip install construct-typing
测试
存根以略微修改的形式针对构建包的 pytest 进行测试。由于测试相对详细,我认为大多数情况都包括在内。
新的类型化构造具有新的书面 pytests,它也通过了所有 pytests 和静态类型检查器。
完全支持以下静态类型检查器:
- 我的
- 版权
解释
存根
构造存根包用于为原始构造包创建类型提示。特别是build
andparse
方法获取类型提示。所以存根的核心是TypeVar
'sParsedType
和BuildTypes
:
Construct.build
: 将由 定义的类型之一的对象转换为BuildTypes
对象bytes
。Construct.parse
: 将bytes
对象转换为 类型的对象ParsedType
。
对于每个Construct
存根文件都定义了它解析到的类型以及可以构建的类型。例如:
构造 | 解析为 (ParsedType) | 从 (BuildTypes) 构建 |
---|---|---|
Int16ub |
int |
int |
Bytes |
bytes |
bytes ,bytearray 或memoryview |
Array(5, Int16ub) |
ListContainer[int] |
typing.List[int] |
Struct("i" / Byte) |
Container[typing.Any] |
typing.Dict[str, typing.Any] 或者None |
问题是描述更复杂的结构,例如:
Sequence
,与仅具有同质子FocusedSeq
cons 的 a 相比,它具有异质子Array
cons。Struct
,BitStruct
,LazyStruct
,Union
具有异构和命名的子结构。
目前只有非常不特定的类型typing.Any
可以用作类型提示(也许将来可以对其进行一些优化,当可变参数泛型可用时)。但最大的缺点是命名子控件的自动完成功能不可用。
注意:存根基于版本 2.10 中的构造。
打字
!!!实验版!!!
为了包含自动完成并进一步增强这些复杂构造的类型提示,construct_typed包用作原始构造包的扩展。它主要是一些专注于类型提示的适配器。
它实现了以下新结构:
DataclassStruct
: 类似于construct.Struct
但严格绑定到DataclassMixin
and@dataclasses.dataclass
DataclassBitStruct
: 类似于construct.BitStruct
但严格绑定到DataclassMixin
and@dataclasses.dataclass
TEnum
:类似于construct.Enum
但严格绑定到一个TEnumBase
类TFlagsEnum
:类似于construct.FlagsEnum
但严格绑定到一个TFlagsEnumBase
类
ParsedType
这些类型是强类型的,这意味着和之间没有区别BuildTypes
。因此,要构建其中一种构造,必须强制执行正确的类型。缺点是代码会有点长,因为你不能例如使用普通dict
的来构建一个DataclassStruct
. 但最大的优势是,如果您使用正确的容器类型而不是 a dict
,静态代码分析可以发挥作用,并在不运行代码本身的情况下发现潜在的类型错误和缺失值。
一个简短的例子:
import dataclasses
import typing as t
from construct import Array, Byte, Const, Int8ub, this
from construct_typed import DataclassMixin, DataclassStruct, EnumBase, TEnum, csfield
class Orientation(EnumBase):
HORIZONTAL = 0
VERTICAL = 1
@dataclasses.dataclass
class Image(DataclassMixin):
signature: bytes = csfield(Const(b"BMP"))
orientation: Orientation = csfield(TEnum(Int8ub, Orientation))
width: int = csfield(Int8ub)
height: int = csfield(Int8ub)
pixels: t.List[int] = csfield(Array(this.width * this.height, Byte))
format = DataclassStruct(Image)
obj = Image(
orientation=Orientation.VERTICAL,
width=3,
height=2,
pixels=[7, 8, 9, 11, 12, 13],
)
print(format.build(obj))
print(format.parse(b"BMP\x01\x03\x02\x07\x08\t\x0b\x0c\r"))
输出:
b'BMP\x01\x03\x02\x07\x08\t\x0b\x0c\r'
Image:
signature = b'BMP' (total 3)
orientation = Orientation.VERTICAL
width = 3
height = 2
pixels = ListContainer:
7
8
9
11
12
13
项目详情
construct_typing- 0.5.2 -py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 553ecf36b44ae8d87e2f9c28a6fc8ffd75d050bd0b66ac72e433046c45b52116 |
|
MD5 | 3c8a0430e2c91b1e13361ca56a586137 |
|
布莱克2-256 | 486f0b630feab9aec30f1fec4b9b07525250c4016868bae771020782b12fec4e |