Dataclasses alternative
Project description
baseclasses
Simple dataclasses alternative (beta)
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
andrepr
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
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 ofdataclasses.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 mirrordataclasses
) - Expose
obj.replace(**kwargs)
(to mirrordataclasses
) - Consider
serialize
property to field - Take advantage of PEP 681 included in Python 3.11
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 851c7d32bff8733217a1c6ac4eff7696a270ad9822e6817264cce30c7ade27a1 |
|
MD5 | 8dff184a1fca5f6982161f0e59bd7deb |
|
BLAKE2b-256 | dbc811ed8eab6cf265bffbabaea9bb4af2c1bbb3f3f0141bdefde10bd9ba4512 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 567008c26e9616984888fccba2e371295fb65d46ddecf3428d7a26bc326fe951 |
|
MD5 | 33cb13c3ed1056560261dc259e6dba50 |
|
BLAKE2b-256 | 3abed5ff9b8715d36b4b63e4a8fdbc04c8a48f4068fbd091d7bacf86eea478ad |