Skip to content

YushiOMOTE/perde

Folders and files

NameName
Last commit message
Last commit date

Latest commit

beeb320 Β· Dec 12, 2020
Aug 27, 2020
Dec 12, 2020
Dec 12, 2020
Nov 28, 2020
Dec 12, 2020
Dec 12, 2020
Dec 12, 2020
Nov 28, 2020
Nov 27, 2020
Nov 29, 2020
Nov 29, 2020
Dec 11, 2020
Dec 12, 2020
Dec 12, 2020
Nov 18, 2020

Repository files navigation

perde: python-wrapped serde

Heavily under construction towards 0.1.0 πŸŽ…

Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public. License PyPi Supported python versions Actions Status codecov Coding style

Python wrapper around the powerful Rust serialization framework.

  • Serialization & deserialization of python data structures.
  • Supports various types including dataclasses, generic types, enum and common built-in types.
  • Supports various serialization formats. By design, perde can support as many format as serde can.
  • Provides string case conversion of field names, skipping serialization/deserialization options, structure flattening.
  • Precise type checking based on type hints.
  • Very fast.

Install

pip install perde

Usage

>>> import perde

Assume you have a dataclass,

>>> @dataclass
... class A:
...     a: int
...     b: str

To serialize class A to JSON,

>>> perde.json.dumps(A(a=10, b='x'))
'{"a":10,"b":"x"}'

To deserialize JSON to class A,

>>> perde.json.loads_as(A, '{"a":10,"b":"x"}')
A(a=10, b='x')

To deserialize JSON to a dictionary,

>>> perde.json.loads('{"a":10,"b":"x"}')
{'a': 10, 'b': 'x'}

More formats are supported.

>>> perde.yaml.dumps(A(10, "x"))
'---\na: 10\nb: x'
>>> perde.yaml.loads_as(A, '---\na: 10\nb: x')
A(a=10, b='x')
>>> perde.msgpack.dumps(A(10, "x"))
b'\x82\xa1a\n\xa1b\xa1x'
>>> perde.msgpack.loads_as(A, b'\x82\xa1a\n\xa1b\xa1x')
A(a=10, b='x')

Supported formats

  • JSON (perde.json)
  • YAML (perde.yaml)
  • MessagePack (perde.msgpack)
  • TOML (perde.toml)
  • CBOR
  • Pickle
  • RON
  • BSON
  • Avro
  • JSON5
  • Postcard
  • URL
  • Environment variables
  • AWS Parameter Store
  • S-expressions
  • D-Bus
  • FlexBuffer
  • XML

Supported types

  • dataclass
  • Primitive types
    • int
    • str
    • float
    • bool
    • bytes
    • bytearray
  • Generic types
    • dict /typing.Dict
    • list / typing.List
    • set / typing.Set
    • frozenset / typing.FrozenSet
    • tuple / typing.Tuple
    • typing.Optional
    • typing.Union
    • typing.Any
  • Enum types
    • Enum
    • IntEnum
    • Flag
    • IntFlag
  • More built-in types
    • datetime.datetime
    • datetime.date
    • datetime.time
    • decimal.Decimal
    • uuid.UUID

Attributes

Attributes allow to modify the way of serialization/deserialization.

For example, to serialize/deserialize the field names as camelCase,

>>> @perde.attr(rename_all="camelCase")
... @dataclass
... class A:
...     foo_bar: int
...     bar_bar: int

>>> perde.json.dumps(A(foo_bar=1, bar_bar=2))
'{"fooBar":1,"barBar":2}'
>>> perde.json.loads_as(A, '{"fooBar":1,"barBar":2}')
A(foo_bar=1, bar_bar=2)

See the book for more details.

Benchmark

The benchmark repeats (de)serializing the data structure A 10000 times:

class A:
    a: int
    b: str
    c: float
    d: bool