diff options
| author | Patrick Rauscher <Patrick.Rauscher@deutschebahn.com> | 2025-10-30 10:13:14 +0100 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-10-31 08:44:37 -0400 |
| commit | 601914722956cc41f1f2c53972d669ddee6ffc04 (patch) | |
| tree | 7371c74ba37e07ff28b9e592163c5765c605d2f8 /django/utils | |
| parent | 340e4f832e1ea74a27770e38635bbc781979f2e0 (diff) | |
Fixed #36696 -- Fixed NameError when inspecting functions with deferred annotations.
In Python 3.14, annotations are deferred by default, so we should not
assume that the names in them have been imported unconditionally.
Diffstat (limited to 'django/utils')
| -rw-r--r-- | django/utils/inspect.py | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/django/utils/inspect.py b/django/utils/inspect.py index 31f3cf994b..ac5e82ca14 100644 --- a/django/utils/inspect.py +++ b/django/utils/inspect.py @@ -1,10 +1,24 @@ import functools import inspect +from django.utils.version import PY314 + +if PY314: + import annotationlib + @functools.lru_cache(maxsize=512) def _get_func_parameters(func, remove_first): - parameters = tuple(inspect.signature(func).parameters.values()) + # As the annotations are not used in any case, inspect the signature with + # FORWARDREF to leave any deferred annotations unevaluated. + if PY314: + signature = inspect.signature( + func, annotation_format=annotationlib.Format.FORWARDREF + ) + else: + signature = inspect.signature(func) + + parameters = tuple(signature.parameters.values()) if remove_first: parameters = parameters[1:] return parameters |
