Skip to main content

添加打字功能的python包“construct”的扩展

项目描述

构造类型

派皮 PyPI - 实现 PyPI - Python 版本 GitHub

这个项目是 python 包结构的扩展,它是一个强大的声明性对称的二进制数据解析器和构建器。该存储库由两个包组成:

  • 构造存根:为整个构造 2.10包添加 .pyi(根据 PEP 561 存根包
  • constructor_typed:添加有助于自动完成和附加类型提示的附加类。

安装

此软件包符合PEP 561。所以大多数静态代码分析器会自动识别存根。安装只需要:

pip install construct-typing

测试

存根以略微修改的形式针对构建包的 pytest 进行测试。由于测试相对详细,我认为大多数情况都包括在内。

新的类型化构造具有新的书面 pytests,它也通过了所有 pytests 和静态类型检查器。

完全支持以下静态类型检查器:

  • 我的
  • 版权

解释

存根

构造存根包用于为原始构造包创建类型提示。特别是buildandparse方法获取类型提示。所以存根的核心是TypeVar'sParsedTypeBuildTypes

  • Construct.build: 将由 定义的类型之一的对象转换为BuildTypes对象bytes
  • Construct.parse: 将bytes对象转换为 类型的对象ParsedType

对于每个Construct存根文件都定义了它解析到的类型以及可以构建的类型。例如:

构造 解析为 (ParsedType) 从 (BuildTypes) 构建
Int16ub int int
Bytes bytes bytes,bytearraymemoryview
Array(5, Int16ub) ListContainer[int] typing.List[int]
Struct("i" / Byte) Container[typing.Any] typing.Dict[str, typing.Any]或者None

问题是描述更复杂的结构,例如:

  • Sequence,与仅具有同质子FocusedSeqcons 的 a 相比,它具有异质子Arraycons。
  • Struct, BitStruct, LazyStruct,Union具有异构和命名的子结构。

目前只有非常不特定的类型typing.Any可以用作类型提示(也许将来可以对其进行一些优化,当可变参数泛型可用时)。但最大的缺点是命名子控件的自动完成功能不可用。

注意:存根基于版本 2.10 中的构造

打字

!!!实验版!!!

为了包含自动完成并进一步增强这些复杂构造的类型提示,construct_typed包用作原始构造包的扩展。它主要是一些专注于类型提示的适配器。

它实现了以下新结构:

  • DataclassStruct: 类似于construct.Struct但严格绑定到DataclassMixinand@dataclasses.dataclass
  • DataclassBitStruct: 类似于construct.BitStruct但严格绑定到DataclassMixinand@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

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

构造-打字-0.5.2.tar.gz (21.4 kB 查看哈希)

已上传 source

内置分布

constructor_typing-0.5.2-py3-none-any.whl (22.6 kB 查看哈希)

已上传 py3