Skip to main content

A serialization addon for attrs

Project description

attrs-serde

A serialization addon for attrs.

person_dict = {"contact": {"personal": {"name": "John"}, "phone": "555-112233"}}

name_path = ["contact", "personal", "name"]
phone_path = ["contact", "phone"]

@serde
@attrs
class Person(object):
    name = attrib(metadata={"to": name_path, "from": name_path})
    phone = attrib(metadata={"to": phone_path, "from": phone_path})

>>> p = Person.from_dict(person_dict)
Person(name=John phone=555-112233)

>>> p.to_dict
{"contact": {"personal": {"name": "John"}, "phone": "555-112233"}}

Quick Start

Install using pip/pipenv/etc. (we recommend poetry for sane dependency management):

$ poetry add attrs-serde

Decorate with serde for automatic to_dict and from_dict. Provide paths in metadata:

  1. from - path to fetch field value from
  2. to - path to serialize value into (creates nested dictionaries as needed)

Example:

from attrs_serde import serde
from attr import attrs, attrib
@serde
@attrs
class Person(object):
    name = attrib(metadata={"to": name_path, "from": name_path})
    phone = attrib(metadata={"to": phone_path, "from": phone_path})

Custom from and to keys (in case you or a different extension use those):

from attrs_serde import serde
from attr import attrs, attrib
@serde(from_key="get", to_key="set")
@attrs
class Person(object):
    name = attrib(metadata={"get": name_path, "set": name_path})
    phone = attrib(metadata={"get": phone_path, "set": phone_path})

Performance

attrs-serde works with cytoolz (mostly C implementation) and so presents very low overhead over what attrs already does.

Against manual object construction:

------------------------------------------------------------------------------------- benchmark 'deserialization': 2 tests ------------------------------------------------------------------------------------
Name (time in ns)              Min                    Max                  Mean                StdDev                Median                 IQR            Outliers  OPS (Kops/s)            Rounds  Iterations
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_deser_baseline       583.2500 (1.0)       5,037.3500 (1.0)        641.4743 (1.0)        161.4237 (1.0)        603.8500 (1.0)       33.7500 (1.0)     2315;3276    1,558.9089 (1.0)       77828          20
test_deser_serde        1,976.0000 (3.39)     88,504.0000 (17.57)    2,226.3774 (3.47)     1,195.7336 (7.41)     2,127.0000 (3.52)     110.0000 (3.26)     484;1576      449.1601 (0.29)      86806           1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Serialization against attr's asdict:

-------------------------------------------------------------------------- benchmark 'serialization': 2 tests --------------------------------------------------------------------------
Name (time in us)        Min                 Max              Mean            StdDev            Median               IQR            Outliers  OPS (Kops/s)            Rounds  Iterations
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_ser_baseline     2.6600 (1.0)      130.4550 (1.33)     2.9098 (1.0)      1.3230 (1.0)      2.7940 (1.0)      0.1320 (1.0)       302;882      343.6625 (1.0)       46642           1
test_ser_serde        5.0390 (1.89)      98.4540 (1.0)      5.6411 (1.94)     2.2398 (1.69)     5.4465 (1.95)     0.2890 (2.19)      491;912      177.2706 (0.52)      32936           1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Thanks:

To all Contributors - you make this happen, thanks!

Copyright

Copyright (c) 2018 @jondot. See LICENSE for further details.

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

attrs-serde-0.2.4.tar.gz (4.2 kB view details)

Uploaded Source

Built Distribution

attrs_serde-0.2.4-py2.py3-none-any.whl (4.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file attrs-serde-0.2.4.tar.gz.

File metadata

  • Download URL: attrs-serde-0.2.4.tar.gz
  • Upload date:
  • Size: 4.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.17 CPython/3.7.3 Darwin/19.0.0

File hashes

Hashes for attrs-serde-0.2.4.tar.gz
Algorithm Hash digest
SHA256 ae820a338cd9dc5aa832a66d13d0193006be96ceb43b331708636566d002efba
MD5 f90134857c2be612cc70b024249259d2
BLAKE2b-256 8c3bc840ffc3f76531c9c39786e732e25ea60b6283d0e8becb14c293eeef683f

See more details on using hashes here.

File details

Details for the file attrs_serde-0.2.4-py2.py3-none-any.whl.

File metadata

  • Download URL: attrs_serde-0.2.4-py2.py3-none-any.whl
  • Upload date:
  • Size: 4.3 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.17 CPython/3.7.3 Darwin/19.0.0

File hashes

Hashes for attrs_serde-0.2.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 c7a8e451f041a1f93bf9ad7477fe5e5ff2d1ad7219c6b35dd91e3e2485caa84c
MD5 1b85c29504ca28858d729ae9529250d3
BLAKE2b-256 2889e4e25e3003c1017634bb5e021019012c0dfc2f65e6217f9ac7d935ee4053

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