From 601914722956cc41f1f2c53972d669ddee6ffc04 Mon Sep 17 00:00:00 2001 From: Patrick Rauscher Date: Thu, 30 Oct 2025 10:13:14 +0100 Subject: 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. --- tests/utils_tests/test_inspect.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'tests') diff --git a/tests/utils_tests/test_inspect.py b/tests/utils_tests/test_inspect.py index 38ea35ecfb..f6e82e5808 100644 --- a/tests/utils_tests/test_inspect.py +++ b/tests/utils_tests/test_inspect.py @@ -1,8 +1,13 @@ import subprocess import unittest +from typing import TYPE_CHECKING from django.shortcuts import aget_object_or_404 from django.utils import inspect +from django.utils.version import PY314 + +if TYPE_CHECKING: + from django.utils.safestring import SafeString class Person: @@ -103,6 +108,16 @@ class TestInspectMethods(unittest.TestCase): self.assertIs(inspect.func_accepts_kwargs(Person.all_kinds), True) self.assertIs(inspect.func_accepts_kwargs(Person().just_args), False) + @unittest.skipUnless(PY314, "Deferred annotations are Python 3.14+ only") + def test_func_accepts_kwargs_deferred_annotations(self): + + def func_with_annotations(self, name: str, complex: SafeString) -> None: + pass + + # Inspection fails with deferred annotations with python 3.14+. Earlier + # Python versions trigger the NameError on module initialization. + self.assertIs(inspect.func_accepts_kwargs(func_with_annotations), False) + class IsModuleLevelFunctionTestCase(unittest.TestCase): @classmethod -- cgit v1.3