dataclasses-struct
A simple Python package that combines
dataclasses with
struct for packing and
unpacking Python dataclasses to fixed-length bytes representations.
Documentation: https://harrymander.xyz/dataclasses-struct
Example
from typing import Annotated
import dataclasses_struct as dcs
@dcs.dataclass_struct()
class Test:
x: int
y: float
z: dcs.UnsignedShort
s: Annotated[bytes, 10] # fixed-length byte array of length 10
@dcs.dataclass_struct()
class Container:
test1: Test
test2: Test
>>> dcs.is_dataclass_struct(Test)
True
>>> t1 = Test(100, -0.25, 0xff, b'12345')
>>> dcs.is_dataclass_struct(t1)
True
>>> t1
Test(x=100, y=-0.25, z=255, s=b'12345')
>>> packed = t1.pack()
>>> packed
b'd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xbf\xff\x0012345\x00\x00\x00\x00\x00'
>>> Test.from_packed(packed)
Test(x=100, y=-0.25, z=255, s=b'12345\x00\x00\x00\x00\x00')
>>> t2 = Test(1, 100, 12, b'hello, world')
>>> c = Container(t1, t2)
>>> Container.from_packed(c.pack())
Container(test1=Test(x=100, y=-0.25, z=255, s=b'12345\x00\x00\x00\x00\x00'), test2=Test(x=1, y=100.0, z=12, s=b'hello, wor'))
Installation
This package is available on pypi:
pip install dataclasses-struct
To work correctly with mypy, an extension is
required; add to your mypy.ini:
[mypy]
plugins = dataclasses_struct.ext.mypy_plugin
See the docs for more info on type checking.
Development and contributing
Pull requests are welcomed!
This project uses uv for packaging and dependency management. To install all dependencies (including development dependencies) into a virtualenv for local development:
uv sync
Uses pytest for testing:
uv run pytest
(You may omit the uv run if the virtualenv is activated.)
Uses ruff for linting and formatting, which is enforced on pull requests:
uv run ruff format
uv run ruff check
See pyproject.toml for the list of enabled checks. I recommend installing the
provided pre-commmit hooks to ensure new commits
pass linting:
pre-commit install
This will help speed-up pull requests by reducing the chance of failing CI checks.
PRs must also pass mypy checks (uv run mypy).
Metadata
Release files for dataclasses-struct 1.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dataclasses_struct-1.5.1.tar.gz | 188.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dataclasses_struct-1.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 203.7 kB
Release files / dataclasses_struct-1.5.1.tar.gz
| Download URL | dataclasses_struct-1.5.1.tar.gz |
|---|---|
| Size | 188.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e65bf61feff0dbb8eb4f4f6523a0eae7f58172ec0484e7a0c5521b255caee2dc
|
|
BLAKE2b-256 checksum How to use checksums |
9bb9c5c3b20c56857d77df815c12153a825fb2991d9357fe4786d9751bb3a950
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / dataclasses_struct-1.5.1-py3-none-any.whl
| Download URL | dataclasses_struct-1.5.1-py3-none-any.whl |
|---|---|
| Size | 15.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d6472a8a5c7781a46f5f063e4f3371e0f31476c853149043b764fb533b258330
|
|
BLAKE2b-256 checksum How to use checksums |
6060f989bad64b0cc4739d3f6b9d95a69052e1266e873bc2cbffc61b3d49e10b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|