diff --git a/src/fiddledyn/serializer.py b/src/fiddledyn/serializer.py index d9337e8..8ab53db 100644 --- a/src/fiddledyn/serializer.py +++ b/src/fiddledyn/serializer.py @@ -80,6 +80,17 @@ def _serialize_recursive(cfg: Any, ctx: SerializationContext) -> Any: return [_serialize_recursive(x, ctx) for x in cfg] if isinstance(cfg, dict): return {k: _serialize_recursive(v, ctx) for k, v in cfg.items()} + if ( + inspect.isfunction(cfg) + or inspect.isbuiltin(cfg) + or inspect.ismethod(cfg) + or inspect.isclass(cfg) + ): + # For builtin functions and methods with module/name, store as a resolvable reference + if hasattr(cfg, "__module__") and hasattr(cfg, "__name__"): + # Store module path and function name so it can be resolved later + # return fdl.Config(f'{value.__module__}.{value.__name__}') + return {"_target_": f"{cfg.__module__}.{cfg.__name__}", "_call_": False} if not isinstance(cfg, (run.Config, run.Partial, fdl.Config, fdl.Partial)): return cfg @@ -106,6 +117,9 @@ def _serialize_recursive(cfg: Any, ctx: SerializationContext) -> Any: if current_id is not None: output["_id_"] = current_id + if isinstance(cfg, (run.Partial, fdl.Partial)): + output["_partial_"] = True + # Handle _call_: False if this was a raw object reference that we serialized? # NOTE: Currently Fiddle configs don't store "_call_" state. # If the object is a Config, it implies _call_=True.