Skip to main content

A type-aware bitfield serializing / deserializing library for Python

Project description

bydantic

Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.

bydantic is a Python library for serializing and deserializing bitfields. bydantic allows you to declaratively define bitfields as Python classes with type hints, which then can be automatically serialized and deserialized to and from raw bytes.

The name bydantic is a portmanteau of "bit" and "pydantic" -- just as pydantic gives developers a way to declaratively define data models with type hints and then serialize and deserialize raw objects against those models, bydantic gives developers a way to do the same with bitfields.

Installation

bydantic is available on PyPI and can be installed using pip:

pip install bydantic

Note: Consider the current version as somewhat of a developer preview. bydantic is still under active development, and the API is still not quite settled.

Quick Start

Here's a simple example of how bydantic can be used:

import bydantic as bd

class Foo(bd.Bitfield):
    a: int = bd.uint_field(4)
    b: int = bd.uint_field(4)
    c: str = bd.str_field(n_bytes=1)

This defines a bitfield with three fields: a and b are 4-bit unsigned integers, and c is a 1-byte (8-bit) string:

Bitfield Diagram

You can then serialize and deserialize instances of Foo to and from raw bytes:

foo = Foo(a=1, b=2, c="x")

# Serialize to bytes
print(foo.to_bytes()) # b'\x12x'

# Deserialize from bytes
foo2 = Foo.from_bytes_exact(b'\x34y')
print(foo2) # Foo(a=3, b=4, c='y')

The power of bydantic, however, is that field types can be composed into complex data structures. For example:

from __future__ import annotations
import bydantic as bd

class Foo(bd.Bitfield):
    a: int = bd.uint_field(4)
    b: int = bd.uint_field(4)
    c: str = bd.str_field(n_bytes=1)


def discriminator(b: Bar):
    return bd.int_field(8) if b.d[0].a == 0 else bd.str_field(n_bytes=1)

class Bar(bd.Bitfield):
    d: list[Foo] = bd.list_field(Foo, n_items = 2)
    e: int | str = bd.dynamic_field(discriminator)

bar = Bar(d=[Foo(a=0, b=1, c="x"), Foo(a=2, b=3, c="y")], e=42)

# Serialize to bytes
print(bar.to_bytes()) # b'\x01x#y*'

# Deserialize from bytes
bar2 = Bar.from_bytes_exact(b'\x01x#y*')
print(bar2) # Bar(d=[Foo(a=0, b=1, c='x'), Foo(a=2, b=3, c='y')], e=42)

This just scratches the surface of what bydantic can do... continue reading the docs for more info.

Features

  • Field type primitives (e.g. int_field, str_field, bytes_field, etc.)
  • Field type combinators (e.g. mapped_field, list_field, dynamic_field, etc.)
  • Clear error messages for serialization / deserialization failures, even when fields are deeply nested

Related Projects

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bydantic-0.0.3.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bydantic-0.0.3-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file bydantic-0.0.3.tar.gz.

File metadata

  • Download URL: bydantic-0.0.3.tar.gz
  • Upload date:
  • Size: 21.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for bydantic-0.0.3.tar.gz
Algorithm Hash digest
SHA256 b4d5150f90f8002d1723e13878d0c1a2bfd6dd69d4d88543e4d828d138f1b446
MD5 205c06b160becdf294b9a2e4b585d8ba
BLAKE2b-256 7dbc052c03154ecee62e81588a11a806eeb9646f09ef1b7a1988efba0e6ecf2b

See more details on using hashes here.

Provenance

The following attestation bundles were made for bydantic-0.0.3.tar.gz:

Publisher: publish-release.yml on khusmann/bydantic

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bydantic-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: bydantic-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 18.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for bydantic-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 148faa749c60b0555a166811a825bed028e29b5f7c392d3a7c20b4a45dff522b
MD5 5ff776d804b260184283cd11684702cd
BLAKE2b-256 d8065f64fede9da54a6f15b0c744216658a23abc150610a7ea08b21dda06b0a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for bydantic-0.0.3-py3-none-any.whl:

Publisher: publish-release.yml on khusmann/bydantic

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page