Skip to main content

Dataclasses alternative

Project description

baseclasses

Simple dataclasses alternative (beta)

PyPI version PyPI Supported Python Versions GitHub Actions (Tests)

Installation

baseclasses is available on PyPI:

pip install baseclasses

Quick Start

baseclasses is an alternative to dataclasses.

There are many such alternatives, and there are a lot of reasons to use them (including the built-in dataclasses), but if you want a library with:

  • No monkey-patched methods generated from strings
  • No special decorators, just regular inheritance
  • Ability to order fields in subclasses as desired
  • Auto-inheritance of parent properties, with ability to change per subclass
  • Emphasis on keyword args over positional args
  • Optional __pre_init__ ability to mutate kwargs
  • Optional ability to reference other kwargs in default_factory func
  • A shorthand helper to specify InternalStateField
  • Ability to differentiate between str and repr

you can give baseclasses a try. E.g.:

from typing import Dict, Optional

import baseclasses


# No decorator
class Foo(baseclasses.FrozenBaseClass):
    a: int
    b: int
    c: Optional[str] = baseclasses.Field(default="hello", hash=False)
    _d: Dict = baseclasses.InternalStateField(default_factory=dict)


# Auto-inherits FrozenBaseClass properties
class ChildFoo(Foo):
    # No problems with child class field ordering
    x: float

    # Dynamic defaults
    y: int = baseclasses.Field(
        default_factory=lambda **kwargs: kwargs["a"] * 2.0
    )


# Override frozen state per child class
class MutableChildFoo(ChildFoo, frozen=False):
    pass

Comparisons to Alternatives

See tests/test_compare.py.

Like dataclasses, but:

  • No issues with adding new optional fields because you're forced to use kwargs in all but the simplest cases
  • Uses metaclass and simple inheritance over monkey-patched generated code
  • Child classes automatically inherit state from parent, so no need to re-declare
  • But you can also change frozen status per child class
  • You can use default_factory(lambda **kwargs: ...) to access init fields
  • Or you can mutate kwargs with an optional __pre_init__
  • More consistent with traditional OOP style (e.g., obj.get_fields() instead of dataclasses.get_fields(obj))

Like dataclassy but:

  • Uses metaclass and simple inheritance over monkey-patched generated code

There are others:

Note: there are perfectly valid reasons for why the Python community decided to use generated code over simple inheritance. baseclasses is just an alternative that implements things differently.

TODO

  • Add init property to field (to mirror dataclasses)
  • Expose obj.replace(**kwargs) (to mirror dataclasses)
  • Consider serialize property to field
  • Take advantage of PEP 681 included in Python 3.11

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

baseclasses-0.1.1.tar.gz (18.1 kB view details)

Uploaded Source

Built Distribution

baseclasses-0.1.1-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file baseclasses-0.1.1.tar.gz.

File metadata

  • Download URL: baseclasses-0.1.1.tar.gz
  • Upload date:
  • Size: 18.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for baseclasses-0.1.1.tar.gz
Algorithm Hash digest
SHA256 851c7d32bff8733217a1c6ac4eff7696a270ad9822e6817264cce30c7ade27a1
MD5 8dff184a1fca5f6982161f0e59bd7deb
BLAKE2b-256 dbc811ed8eab6cf265bffbabaea9bb4af2c1bbb3f3f0141bdefde10bd9ba4512

See more details on using hashes here.

File details

Details for the file baseclasses-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: baseclasses-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for baseclasses-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 567008c26e9616984888fccba2e371295fb65d46ddecf3428d7a26bc326fe951
MD5 33cb13c3ed1056560261dc259e6dba50
BLAKE2b-256 3abed5ff9b8715d36b4b63e4a8fdbc04c8a48f4068fbd091d7bacf86eea478ad

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