From 68ad77110b2757eddb17c50b45ea530499718d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 21 Jul 2024 14:14:31 +0200 Subject: [PATCH] Fix `routing.get_name()` not to assume all routines have `__name__` Fix `routing.get_name()` to use the `__name__` attribute only if it is actually present, rather than assuming that all routine and class types have it, and use the fallback to class name otherwise. This is necessary for `functools.partial()` that doesn't have a `__name__` attribute, but is recognized as a routine starting with Python 3.13.0b3. Since for older versions of Python, it would have used the fallback anyway, this doesn't really change the behavior there. Fixes #2638 --- starlette/routing.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/starlette/routing.py b/starlette/routing.py index 75a5ec3f3..481b13f5d 100644 --- a/starlette/routing.py +++ b/starlette/routing.py @@ -99,9 +99,7 @@ async def app(scope: Scope, receive: Receive, send: Send) -> None: def get_name(endpoint: typing.Callable[..., typing.Any]) -> str: - if inspect.isroutine(endpoint) or inspect.isclass(endpoint): - return endpoint.__name__ - return endpoint.__class__.__name__ + return getattr(endpoint, "__name__", endpoint.__class__.__name__) def replace_params(