def serialize()

in o2a/utils/python_serializer.py [0:0]


def serialize(serializable_obj: Any) -> str:
    """
    Serialize to Python code
    """

    def serialize_recursively(target: Any, markers: Set[int]) -> str:
        marker_id = id(target)
        if marker_id in markers:
            raise ValueError("Circular reference detected")
        markers.add(marker_id)

        if isinstance(target, str):
            buf = f"{escape_string_with_python_escapes(target)}"
        elif isinstance(target, dict):
            buf = "{"
            buf += ", ".join(
                f"{serialize_recursively(key, markers)}: {serialize_recursively(value, markers)}"
                for key, value in target.items()
            )
            buf += "}"
        elif isinstance(target, list):
            buf = "["
            buf += ", ".join(serialize_recursively(item, markers) for item in target)
            buf += "]"
        elif isinstance(target, set):
            if target:
                buf = "{"
                buf += ", ".join(serialize_recursively(item, markers) for item in target)
                buf += "}"
            else:
                buf = "set()"
        elif isinstance(target, tuple):
            buf = "("
            buf += ", ".join(serialize_recursively(item, markers) for item in target)
            buf += ")"
        elif target is True:
            buf = "True"
        elif target is False:
            buf = "False"
        elif target is None:
            buf = "None"
        else:
            raise ValueError(f"Type '{type(target)}' is not serializable")

        markers.remove(marker_id)
        return buf

    return serialize_recursively(serializable_obj, set())