dataclass-extensions 0.2.4__py3-none-any.whl → 0.2.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dataclass_extensions/decode.py +1 -1
- dataclass_extensions/version.py +1 -1
- {dataclass_extensions-0.2.4.dist-info → dataclass_extensions-0.2.5.dist-info}/METADATA +27 -7
- {dataclass_extensions-0.2.4.dist-info → dataclass_extensions-0.2.5.dist-info}/RECORD +7 -7
- {dataclass_extensions-0.2.4.dist-info → dataclass_extensions-0.2.5.dist-info}/WHEEL +1 -1
- {dataclass_extensions-0.2.4.dist-info → dataclass_extensions-0.2.5.dist-info}/licenses/LICENSE +0 -0
- {dataclass_extensions-0.2.4.dist-info → dataclass_extensions-0.2.5.dist-info}/top_level.txt +0 -0
dataclass_extensions/decode.py
CHANGED
dataclass_extensions/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
VERSION = "0.2.
|
|
1
|
+
VERSION = "0.2.5"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataclass-extensions
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: Additional functionality for Python dataclasses
|
|
5
5
|
Author-email: Pete Walsh <epwalsh10@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -231,6 +231,8 @@ Additional functionality for Python dataclasses
|
|
|
231
231
|
|
|
232
232
|
## Installation
|
|
233
233
|
|
|
234
|
+
Python 3.10 or newer is required. You can install the package from PyPI:
|
|
235
|
+
|
|
234
236
|
```fish
|
|
235
237
|
pip install dataclass-extensions
|
|
236
238
|
```
|
|
@@ -249,18 +251,39 @@ class Fruit:
|
|
|
249
251
|
calories: int
|
|
250
252
|
price: float
|
|
251
253
|
|
|
252
|
-
|
|
253
254
|
@dataclass
|
|
254
255
|
class FruitBasket:
|
|
255
256
|
fruit: Fruit
|
|
256
257
|
count: int
|
|
257
258
|
|
|
258
|
-
|
|
259
259
|
basket = FruitBasket(fruit=Fruit(calories=200, price=1.0), count=2)
|
|
260
260
|
assert encode(basket) == {"fruit": {"calories": 200, "price": 1.0}, "count": 2}
|
|
261
261
|
assert decode(FruitBasket, encode(basket)) == basket
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
+
You can also define how to encode/decode non-dataclass types:
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
```python
|
|
268
|
+
from dataclasses import dataclass
|
|
269
|
+
from dataclass_extensions import decode, encode
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class Foo:
|
|
273
|
+
def __init__(self, x: int):
|
|
274
|
+
self.x = x
|
|
275
|
+
|
|
276
|
+
@dataclass
|
|
277
|
+
class Bar:
|
|
278
|
+
foo: Foo
|
|
279
|
+
|
|
280
|
+
encode.register_encoder(lambda foo: {"x": foo.x}, Foo)
|
|
281
|
+
decode.register_decoder(lambda d: Foo(d["x"]), Foo)
|
|
282
|
+
|
|
283
|
+
encode(Bar(foo=Foo(10))) # {'foo': {'x': 10}}
|
|
284
|
+
decode(Bar, {"foo": {"x": 10}})
|
|
285
|
+
```
|
|
286
|
+
|
|
264
287
|
### Registrable subclasses
|
|
265
288
|
|
|
266
289
|
```python
|
|
@@ -273,28 +296,25 @@ class Fruit(Registrable):
|
|
|
273
296
|
calories: int
|
|
274
297
|
price: float
|
|
275
298
|
|
|
276
|
-
|
|
277
299
|
@Fruit.register("banana")
|
|
278
300
|
@dataclass
|
|
279
301
|
class Banana(Fruit):
|
|
280
302
|
calories: int = 200
|
|
281
303
|
price: float = 1.25
|
|
282
304
|
|
|
283
|
-
|
|
284
305
|
@Fruit.register("apple")
|
|
285
306
|
@dataclass
|
|
286
307
|
class Apple(Fruit):
|
|
287
308
|
calories: int = 150
|
|
288
309
|
price: float = 1.50
|
|
289
310
|
|
|
290
|
-
|
|
291
311
|
@dataclass
|
|
292
312
|
class FruitBasket:
|
|
293
313
|
fruit: Fruit
|
|
294
314
|
count: int
|
|
295
315
|
|
|
296
|
-
|
|
297
316
|
basket = FruitBasket(fruit=Apple(), count=2)
|
|
317
|
+
# note the additional "type" field, which corresponds to the registered name of the subclass
|
|
298
318
|
assert encode(basket) == {"fruit": {"calories": 150, "price": 1.5, "type": "apple"}, "count": 2}
|
|
299
319
|
assert decode(FruitBasket, encode(basket)) == basket
|
|
300
320
|
```
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
dataclass_extensions/__init__.py,sha256=jpgRh5jjj9jM1tkhTVvB-aDThI2v4tAlq_WpR0-NOSI,255
|
|
2
|
-
dataclass_extensions/decode.py,sha256=
|
|
2
|
+
dataclass_extensions/decode.py,sha256=mfCmE8U8s40xRKE4Nd4MhlL1dwpcrcKSUbWaFqw9NrA,7465
|
|
3
3
|
dataclass_extensions/encode.py,sha256=7mLHmZrHThQMbC0wY5voHx3mOHgsRbq59kw_JdwgOOg,3324
|
|
4
4
|
dataclass_extensions/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
dataclass_extensions/registrable.py,sha256=TWdJ0vLkOTsw5Zm8uOk7Ueh6ZODn-q_2jht1uWRkpzE,4608
|
|
6
6
|
dataclass_extensions/types.py,sha256=UwSV0MKjFDaK4dlgm72vJHHr6-8QNe8jMhbTZGOMIJM,247
|
|
7
7
|
dataclass_extensions/utils.py,sha256=8cigzY9JDEWexWXlcMxXyf27S50-1ZPMNmn4zUSrc6k,935
|
|
8
|
-
dataclass_extensions/version.py,sha256=
|
|
9
|
-
dataclass_extensions-0.2.
|
|
10
|
-
dataclass_extensions-0.2.
|
|
11
|
-
dataclass_extensions-0.2.
|
|
12
|
-
dataclass_extensions-0.2.
|
|
13
|
-
dataclass_extensions-0.2.
|
|
8
|
+
dataclass_extensions/version.py,sha256=sIh4VI6K8WvZPswkYvGqS-J8LeZb01HJ4SVcHLlcPMs,18
|
|
9
|
+
dataclass_extensions-0.2.5.dist-info/licenses/LICENSE,sha256=YvuKOpYh3COIF0yqq-nCMXtpS7mh1GyYvPVlW2j1G-M,11359
|
|
10
|
+
dataclass_extensions-0.2.5.dist-info/METADATA,sha256=EWYw300Hyd_2w-l-7pc_BIqmOCVrwn-nz8q4GjhgG5Q,15825
|
|
11
|
+
dataclass_extensions-0.2.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
12
|
+
dataclass_extensions-0.2.5.dist-info/top_level.txt,sha256=njfdeqLtTThNGwqnoKu4JV8J1287xGAeEwyESpoU-k8,21
|
|
13
|
+
dataclass_extensions-0.2.5.dist-info/RECORD,,
|
{dataclass_extensions-0.2.4.dist-info → dataclass_extensions-0.2.5.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|