使用结构将数据类作为二进制缓冲区写入和读取的装饰器。
项目描述
数据类结构 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_buffer和to_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 的 哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | af93bbfcf757ac9e1fb9382eee0fdaf189429c9ef531affd8086fc78555381c4 |
|
| MD5 | 7ea1c37648643701cdef78fc2288373d |
|
| 布莱克2-256 | eb13139db3d98983845ded5367a572d7aa4c2e5a9135446a94fa11a9b8105bf8 |