Skip to main content

使用结构将数据类作为二进制缓冲区写入和读取的装饰器。

项目描述

数据类结构 0.9.3

装饰器提供将装饰数据类作为二进制缓冲区发出和读取的能力。一个特殊的新元数据字段STRUCT_TYPE包含数据类字段的结构格式。

有关格式化选项,请参阅struct文档。

功能

装饰器@dataclass_struct将以下方法添加到装饰数据类。

from_buffer(self, buffer: bytes, offset=0)

 Read the wrapped dataclass from a binary buffer.
      
 :param self: wrapped instance
 :param buffer: buffer tp read
 :param offset: (optional) offset o start reading
 :return: offset after last consumed byte

instance_from_buffer(缓冲区:字节,偏移量=0)

 Construct a wrapped class instance from a buffer.
       
 :param buffer: buffer with source binary data
 :return: class instance

to_buffer(自我,缓冲区=b'')

 Store the wrapped dataclass to a binary buffer.
       
 :param self: wrapped instance
 :return: resulting buffer

限制

目前,不支持某些功能:

  • 没有继承层次结构
  • 没有元组

如果数据类成员提供方法from_bufferto_buffer,它将被包含在结果缓冲区中并从中加载,而无需STRUCT_TYPE自己的元数据。

如果列表成员的数量与格式元素的数量匹配,则可以使用原始类型的列表。如果没有,将发出来自底层结构调用的错误消息。

当对象类提供相应的方法时,将写入/加载用户定义的对象列表。这些也不需要STRUCT_TYPE元数据。

用法

浮点数和整数的简单缓冲区

具有元数据字段的字段STRUCT_TYPE 将从缓冲区中写入/读出。

from dataclass_struct import STRUCT_TYPE, dataclass_struct

@dataclass_struct
class MyDataClass:
    my_flt: float = field(default=0, metadata={STRUCT_TYPE: '<f'})
    my_num: int = field(default=0, metadata={STRUCT_TYPE: '<i'})
    my_name: str = ''

test_obj = TestModel(3.14, 42)
buff = test_obj.to_buffer()

# buff equals to b'\xc3\xf5H@*\x00\x00\x00'

包含另一个 dataclass_struct 实例的类

提供方法from_buffer和字段的字段to_buffer

from dataclasses import field
from dataclass_struct import STRUCT_TYPE, dataclass_struct

@dataclass_struct
class DataClassA:
    my_flt: float = field(default=0, metadata={STRUCT_TYPE: '<f'})
    my_num: int = field(default=0, metadata={STRUCT_TYPE: '<i'})

@dataclass_struct
class DataClassB:
    data_part_a: DataClassA = field(default=DataClassA())
    just_a_num: int = field(default=0, metadata={STRUCT_TYPE: '<i'})

test_obj = DataClassB(DataClassA(3.14, 42),  42)
buff = test_obj.to_buffer()

# buff equals to b'\xc3\xf5H@*\x00\x00\x00*\x00\x00\x00'

具有自定义编码的字符串

字符串的默认编码是'utf-8'. 这可以通过装饰器参数为整个数据类更改use_encoding,或使用元数据为特定字段更改ENCODING

@dataclass_struct(use_encoding='ascii')
class DefaultEncodingTest:
    byte_name: bytes = field(default=b'', metadata={STRUCT_TYPE: '16s'})
    str_name: str = field(default='', metadata={STRUCT_TYPE: '16s'})
    str_with_enc: str = field(default='', metadata={STRUCT_TYPE: '32s', ENCODING: 'utf-16'})


test_obj = StringTest(b'Hello World', 'Bye bye', 'another one')
buff = test_obj.to_buffer())

# buff equals to b'Hello World\x00\x00\x00\x00\x00Bye bye\x00\x00\x00'\
#            b'\x00\x00\x00\x00\x00\x00\xff\xfea\x00n\x00o\x00t\x00h'\
#            b'\x00e\x00r\x00 \x00o\x00n\x00e\x00\x00\x00\x00\x00\x00'\
#            b'\x00\x00\x00'

为底层数据类使用自定义参数

@dataclass_struct
@dataclass(order=True)
class ExplicitDataclass:
    my_flt: float = field(default=0, metadata={STRUCT_TYPE: '<f'})
    my_num: int = field(default=0, metadata={STRUCT_TYPE: '<i'})

项目详情


下载文件

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

源分布

dataclass_struct-0.9.4.tar.gz (4.5 kB 查看哈希

已上传 source