core: Cache RunnableLambda __repr__ (#29199)

`RunnableLambda`'s `__repr__` may do costly OS operation by calling
`get_lambda_source`.
So it's better to cache it.
See #29043

---------

Co-authored-by: Chester Curme <chester.curme@gmail.com>
This commit is contained in:
Christophe Bornet 2025-01-23 19:34:47 +01:00 committed by GitHub
parent 618e550f06
commit b6ae7ca91d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4347,6 +4347,8 @@ class RunnableLambda(Runnable[Input, Output]):
except AttributeError:
pass
self._repr: Optional[str] = None
@property
@override
def InputType(self) -> Any:
@ -4525,14 +4527,18 @@ class RunnableLambda(Runnable[Input, Output]):
def __repr__(self) -> str:
"""A string representation of this Runnable."""
if hasattr(self, "func") and isinstance(self.func, itemgetter):
return f"RunnableLambda({str(self.func)[len('operator.') :]})"
elif hasattr(self, "func"):
return f"RunnableLambda({get_lambda_source(self.func) or '...'})"
elif hasattr(self, "afunc"):
return f"RunnableLambda(afunc={get_lambda_source(self.afunc) or '...'})"
else:
return "RunnableLambda(...)"
if self._repr is None:
if hasattr(self, "func") and isinstance(self.func, itemgetter):
self._repr = f"RunnableLambda({str(self.func)[len('operator.') :]})"
elif hasattr(self, "func"):
self._repr = f"RunnableLambda({get_lambda_source(self.func) or '...'})"
elif hasattr(self, "afunc"):
self._repr = (
f"RunnableLambda(afunc={get_lambda_source(self.afunc) or '...'})"
)
else:
self._repr = "RunnableLambda(...)"
return self._repr
def _invoke(
self,