]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🐛 Fix evaluating stringified annotations in Python 3.10 (#11355)
authorchaen <christophe.haen@cern.ch>
Thu, 4 Dec 2025 08:18:32 +0000 (09:18 +0100)
committerGitHub <noreply@github.com>
Thu, 4 Dec 2025 08:18:32 +0000 (09:18 +0100)
Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
Co-authored-by: svlandeg <svlandeg@github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
fastapi/dependencies/utils.py
tests/test_stringified_annotations_simple.py [new file with mode: 0644]

index 91348c8ea1a7c17e55e37312dc8667b4fc7e0db2..1ff35f64831dd7585ddf197fcb32d8107fd3f6ad 100644 (file)
@@ -1,5 +1,6 @@
 import dataclasses
 import inspect
+import sys
 from contextlib import AsyncExitStack, contextmanager
 from copy import copy, deepcopy
 from dataclasses import dataclass
@@ -191,7 +192,10 @@ def get_flat_params(dependant: Dependant) -> List[ModelField]:
 
 
 def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature:
-    signature = inspect.signature(call)
+    if sys.version_info >= (3, 10):
+        signature = inspect.signature(call, eval_str=True)
+    else:
+        signature = inspect.signature(call)
     unwrapped = inspect.unwrap(call)
     globalns = getattr(unwrapped, "__globals__", {})
     typed_params = [
@@ -217,7 +221,10 @@ def get_typed_annotation(annotation: Any, globalns: Dict[str, Any]) -> Any:
 
 
 def get_typed_return_annotation(call: Callable[..., Any]) -> Any:
-    signature = inspect.signature(call)
+    if sys.version_info >= (3, 10):
+        signature = inspect.signature(call, eval_str=True)
+    else:
+        signature = inspect.signature(call)
     unwrapped = inspect.unwrap(call)
     annotation = signature.return_annotation
 
diff --git a/tests/test_stringified_annotations_simple.py b/tests/test_stringified_annotations_simple.py
new file mode 100644 (file)
index 0000000..9bd6d09
--- /dev/null
@@ -0,0 +1,26 @@
+from __future__ import annotations
+
+from fastapi import Depends, FastAPI, Request
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+from .utils import needs_py310
+
+
+class Dep:
+    def __call__(self, request: Request):
+        return "test"
+
+
+@needs_py310
+def test_stringified_annotations():
+    app = FastAPI()
+
+    client = TestClient(app)
+
+    @app.get("/test/")
+    def call(test: Annotated[str, Depends(Dep())]):
+        return {"test": test}
+
+    response = client.get("/test")
+    assert response.status_code == 200