Skip to content

Serialization to JSON#

TracingNode can be serialized into JSON via to_dict method:

from treetrace import TracingNode

with TracingNode("my node", inputs={"x": 42}) as node:
    node.set_result("my_result")

Calling node.to_dict() returns:

{
  "_type": "TracingNode",
  "name": "my node",
  "uid": "2023-08-23T16-41-35-my_node-Z9YpEb",
  "inputs": {
    "x": 42
  },
  "result": "my_result",
  "start_time": "2023-08-23T16:41:35.811159",
  "end_time": "2023-08-23T16:41:35.811210"
}

When inputs or a result are not directly serializable into JSON options are provided:

Serialization of dataclasses#

Dataclasses are serialized as dict:

from dataclasses import dataclass
from treetrace import TraceNode, with_trace

@dataclass
class Person:
    name: str
    age: int

@with_trace
def say_hi(person):
    return f"Hi {person.name}!"

with TracingNode("root") as c:
    person = Person("Alice", 21)
    say_hi(person)

creates the following JSON description of the node:

{
  "_type": "TracingNode",
  "name": "root",
  "uid": "2023-08-23T16:52:43-root-H4JCSN",
  "children": [
    {
      "_type": "TracingNode",
      "name": "say_hi",
      "uid": "2023-08-23T16:52:43-say_hi-GGfCCe",
      "kind": "call",
      "result": "Hi Alice!",
      "inputs": {
        "person": {                     # <<<<
          "name": "Alice",              # <<<<
          "age": 21,                    # <<<<
          "_type": "Person"             # <<<<
        }
      },
      "start_time": "2023-08-23T16:52:43.115548",
      "end_time": "2023-08-23T16:52:43.115572"
    }
  ],
  "start_time": "2023-08-23T16:52:43.115449",
  "end_time": "2023-08-23T16:52:43.115585"
}

Method __trace_to_node__#

A user type may define method __trace_to_node__ to provide a custom serializer.

class Person:
    name: str
    age: int

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __trace_to_node__(self):
        return {"name": self.name, "age": self.age}

person = Person("Peter", 24)

When person is serialized, the following dictionary is produced:

{
    "name": "Peter",
    "age": 24,
    "_type": "Person"
}

Registration of serializer#

Sometimes we do not or we cannot modify a class. Registration a serializer for a given type is there for this purpose.

from treetrace import register_custom_serializer


class MyClass:
    def __init__(self, x):
        self.x = x


def myclass_serializer(m: MyClass):
    return {"x": m.x}


register_custom_serializer(MyClass, myclass_serializer)

Fallback#

When no mechanism above is used then only name of the type and object id is serialized.

E.g.:

{
    "_type": "Person",
    "id": 140263930622832
}