Skip to main content

Light and fast packer dataclasses to binary

Project description

BINARY PACKER

Light and fast packer python dataclasses to bytes

Build Status CodeFactor

Install

How it works

It's a wrap! A wrap over stdlib struct
So it converts values into bytes using struct.pack().
But it does not save keys and values' types in bytes, so be sure about how you configure packer for packing and unpacking.

Why and when should it be used?

We all like to use json/xml/pickle and other popular libraries for dumping data, but sometimes they are too slow or result's size ot too large.
This library works much faster than other packers like json and makes result a lot more compact.

Example of Usage

import uuid
from typing import Optional
from dataclasses import dataclass

from binary_packer import PackerFactory, FieldStruct


@dataclass
class Person:
    id: uuid.UUID
    name: Optional[str] = None  # max length is 20 bytes
    age: Optional[int] = None

person = Person(id=uuid.uuid4(), name='vaschevsky', age=33)


factory = PackerFactory(
    Person,
    id=FieldStruct[uuid.UUID, bytes](
        '16s',  # '16s' is for bytearray length of 16, uuid as bytearray also 16 bytes
        encoder=lambda uid: uid.bytes,
        decoder=lambda uid_as_bytes: uuid.UUID(bytes=uid_as_bytes),
    ),
    name=FieldStruct[str, bytes](
        '20s',  # '20s' is for bytearray length of 20, each byte is ascii char
        encoder=lambda name: name.encode(),
        decoder=lambda name_as_bytes: name_as_bytes.decode().strip('\x00'),
    ),
    age=FieldStruct[int, int](
        'B',  #  'B' is for unsigned tiny int (1 byte) => age can be any value from 0 to 255,
        # no need for custom encoder/decoder
    )
)

packer_1 = factory.make_packer('id', 'name', 'age')
packer_2 = factory.make_packer('id', 'name')
packer_3 = factory.make_packer('id')

for packer in (packer_1, packer_2, packer_3):
    data_as_bytes = packer.pack(person)
    print(f'{len(data_as_bytes)=}')
    unpacked_person = packer.unpack(data_as_bytes)
    print(f'{unpacked_person=}')

# will be printed:
# len(data_as_bytes)=37
# unpacked_person=Person(id=UUID('a72decb7-7f9e-497b-ac91-692e316a7580'), name='vaschevsky', age=33)
# len(data_as_bytes)=36
# unpacked_person=Person(id=UUID('a72decb7-7f9e-497b-ac91-692e316a7580'), name='vaschevsky', age=None)
# len(data_as_bytes)=16
# unpacked_person=Person(id=UUID('a72decb7-7f9e-497b-ac91-692e316a7580'), name=None, age=None)

Buy Me A Coffee

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

binary_packer-1.0.1.tar.gz (5.4 kB view details)

Uploaded Source

Built Distribution

binary_packer-1.0.1-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file binary_packer-1.0.1.tar.gz.

File metadata

  • Download URL: binary_packer-1.0.1.tar.gz
  • Upload date:
  • Size: 5.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for binary_packer-1.0.1.tar.gz
Algorithm Hash digest
SHA256 d72af2dc6de8653d6f9bddfb0741589db9322c0ad1199769f70f60c9bfd019ca
MD5 b49ccadc625ca1ca814169d3c70cd612
BLAKE2b-256 3a6916e53f8e0c5cfb24adb47b627928b6e1119f4a5b1f830f650971ddcf0d44

See more details on using hashes here.

File details

Details for the file binary_packer-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for binary_packer-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 60063d4c32c6c8e6de35c4aa5f7d5d23ba099934a620b76d9083939722409f2c
MD5 f39b17195eadb0648cb32fa5b1a74fb9
BLAKE2b-256 20c87e79c3e27f5ef14408159043af43adfc6ac790bdc56bb0cb4fca4b278366

See more details on using hashes here.

Supported by

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