dataclass tools, extended by multiple dispatch
Project description
dataclassish
Tools from dataclasses
, extended to all of Python
Python's dataclasses
provides tools for working with objects, but only
compatible @dataclass
objects. 😢
This repository is a superset of those
tools and extends them to work on ANY Python object you want! 🎉
You can
easily register in object-specific methods and use a unified interface for
object manipulation. 🕶️
For example,
from dataclassish import replace # New object, replacing select fields
d1 = {"a": 1, "b": 2.0, "c": "3"}
d2 = replace(d1, c=3 + 0j)
print(d2)
# {'a': 1, 'b': 2.0, 'c': (3+0j)}
Installation
pip install dataclassish
Documentation
WIP. But if you've worked with a
dataclass
then you
basically already know everything you need to know.
Quick example
In this Example we'll show how dataclassish
works exactly the same as
dataclasses
when working with a @dataclass
object.
from dataclassish import replace
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
p = Point(1.0, 2.0)
print(p)
# Point(x=1.0, y=2.0)
p2 = replace(p, x=3.0)
print(p2)
# Point(x=3.0, y=2.0)
Now we'll work with a dict
object. Note that you cannot use tools from
dataclasses
with dict
objects.
from dataclassish import replace
p = {"x": 1, "y": 2.0}
print(p)
# {'x': 1, 'y': 2.0}
p2 = replace(p, x=3.0)
print(p2)
# {'x': 3.0, 'y': 2.0}
# If we try to `replace` a value that isn't in the dict, we'll get an error
try:
replace(p, z=None)
except ValueError as e:
print(e)
# invalid keys {'z'}.
Registering in a custom type is very easy! Let's make a custom object and define
how replace
will operate on it.
from typing import Any
from plum import dispatch
class MyClass:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __repr__(self) -> str:
return f"MyClass(a={self.a},b={self.b},c={self.c})"
@dispatch
def replace(obj: MyClass, **changes: Any) -> MyClass:
current_args = {k: getattr(obj, k) for k in "abc"}
updated_args = current_args | changes
return MyClass(**updated_args)
obj = MyClass(1, 2, 3)
print(obj)
# MyClass(a=1,b=2,c=3)
obj2 = replace(obj, c=4.0)
print(obj2)
# MyClass(a=1,b=2,c=4.0)
Citation
If you found this library to be useful in academic work, then please cite.
Development
We welcome contributions!
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
Built Distribution
File details
Details for the file dataclassish-0.1.0.tar.gz
.
File metadata
- Download URL: dataclassish-0.1.0.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.0 CPython/3.12.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5bfc27d0d59d0154b14b6e7eae75116943db8cc334660590c8d0523da271b64 |
|
MD5 | 46feb487da406d641b198ed8be27a7cc |
|
BLAKE2b-256 | 2d8482c227e611411f85ba01406362740d10b50ec7798788e0d3277c685762c4 |
File details
Details for the file dataclassish-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: dataclassish-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.0 CPython/3.12.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0bb8a7059cf9a45d5378fd6e33e0f49b0997100a2d21d57f6f9a8a8dfe610f82 |
|
MD5 | cf5f422981eb8ea5ad89a898b81861e2 |
|
BLAKE2b-256 | b043412d55209e5700aca0a9d46cf1ac85928f1e1abaad74c5de4bb244115a5b |