enumとdataclassを含んだ値をserialize/deserializeするためにjsonpickleを使う

以前の記事の続き。

何も頑張って自作せずともjsonpickleを使えば良いかもしれない。

github.com

import dataclasses
import enum
import jsonpickle


class Status(enum.Enum):
    x = enum.auto()
    y = enum.auto()
    z = enum.auto()


@dataclasses.dataclass
class A:
    name: str
    age: int
    status: Status


a = A(name="foo", age=0, status=Status.y)
print(jsonpickle.encode(a))
print(jsonpickle.decode(jsonpickle.encode(a)))
print(jsonpickle.decode(jsonpickle.encode(a)) == a)

こんな感じ。

{"py/object": "__main__.A", "name": "foo", "age": 0, "status": {"py/reduce": [{"py/type": "__main__.Status"}, {"py/tuple": [2]}]}}
A(name='foo', age=0, status=<Status.y: 2>)
True

以下のようにするとindentも調整できるし、手で触れる程度にはなるのではないか?

from functools import partial
import jsonpickle

encode = partial(jsonpickle.encode, indent=2)

gist