Skip to main content

Additional functionality for Python dataclasses

Project description

dataclass-extensions

Additional functionality for Python dataclasses

Installation

Python 3.10 or newer is required. You can install the package from PyPI:

pip install dataclass-extensions

Features

Encode/decode to/from JSON-safe dictionaries

from dataclasses import dataclass
from dataclass_extensions import decode, encode


@dataclass
class Fruit:
    calories: int
    price: float

@dataclass
class FruitBasket:
    fruit: Fruit
    count: int

basket = FruitBasket(fruit=Fruit(calories=200, price=1.0), count=2)
assert encode(basket) == {"fruit": {"calories": 200, "price": 1.0}, "count": 2}
assert decode(FruitBasket, encode(basket)) == basket

You can also define how to encode/decode non-dataclass types:

from dataclasses import dataclass
from dataclass_extensions import decode, encode


class Foo:
    def __init__(self, x: int):
        self.x = x

@dataclass
class Bar:
    foo: Foo

encode.register_encoder(lambda foo: {"x": foo.x}, Foo)
decode.register_decoder(lambda d: Foo(d["x"]), Foo)

encode(Bar(foo=Foo(10)))  # {'foo': {'x': 10}}
decode(Bar, {"foo": {"x": 10}})

Registrable subclasses

from dataclasses import dataclass
from dataclass_extensions import Registrable, decode, encode


@dataclass
class Fruit(Registrable):
    calories: int
    price: float

@Fruit.register("banana")
@dataclass
class Banana(Fruit):
    calories: int = 200
    price: float = 1.25

@Fruit.register("apple")
@dataclass
class Apple(Fruit):
    calories: int = 150
    price: float = 1.50

@dataclass
class FruitBasket:
    fruit: Fruit
    count: int

basket = FruitBasket(fruit=Apple(), count=2)
# note the additional "type" field, which corresponds to the registered name of the subclass
assert encode(basket) == {"fruit": {"calories": 150, "price": 1.5, "type": "apple"}, "count": 2}
assert decode(FruitBasket, encode(basket)) == basket

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

dataclass_extensions-0.2.6.tar.gz (16.8 kB view details)

Uploaded Source

Built Distribution

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

dataclass_extensions-0.2.6-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file dataclass_extensions-0.2.6.tar.gz.

File metadata

  • Download URL: dataclass_extensions-0.2.6.tar.gz
  • Upload date:
  • Size: 16.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for dataclass_extensions-0.2.6.tar.gz
Algorithm Hash digest
SHA256 31e71060d919d24a78697b83f8bf9a7b2fc15c7c150b0cd2efa2bfd17374a22b
MD5 aeee65b25e46a5dae4701a47974c5304
BLAKE2b-256 e38c07c3a7aeeb2617dd4d3ff64b0956bfddf93cbdfbecca53f303d65b217c47

See more details on using hashes here.

File details

Details for the file dataclass_extensions-0.2.6-py3-none-any.whl.

File metadata

File hashes

Hashes for dataclass_extensions-0.2.6-py3-none-any.whl
Algorithm Hash digest
SHA256 06831865ca1394e264f431837437281f062f9423338935005783249f5a2e160b
MD5 fd6203214e55e807c2f95a288b36d51a
BLAKE2b-256 3579f880fd0bb3312cd020afc6a2d1cfdb9380a264e438b70a95631fa582e765

See more details on using hashes here.

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