Bug report
Bug description:
inspect.getfullargspec isn't compatible with 3.14 signatures that depend on deferred evaluation of annotations, and doesn't expose an argument to pass through annotationlib.Format.FORWARDREF to prevent the failure.
import inspect
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Iterable
def func(a: Iterable):
return
inspect.getfullargspec(func)
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/inspect.py", line 1261, in getfullargspec
sig = _signature_from_callable(func,
follow_wrapper_chains=False,
skip_bound_arg=False,
sigcls=Signature,
eval_str=False)
File "/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/inspect.py", line 2502, in _signature_from_callable
return _signature_from_function(sigcls, obj,
skip_bound_arg=skip_bound_arg,
globals=globals, locals=locals, eval_str=eval_str,
annotation_format=annotation_format)
File "/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/inspect.py", line 2325, in _signature_from_function
annotations = get_annotations(func, globals=globals, locals=locals, eval_str=eval_str,
format=annotation_format)
File "/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/annotationlib.py", line 890, in get_annotations
ann = _get_dunder_annotations(obj)
File "/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/annotationlib.py", line 1059, in _get_dunder_annotations
ann = getattr(obj, "__annotations__", None)
File "<stdin>", line 1, in __annotate__
def func(a: Iterable):
^^^^^^^^
NameError: name 'Iterable' is not defined
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
inspect.getfullargspec(func)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/inspect.py", line 1271, in getfullargspec
raise TypeError('unsupported callable') from ex
TypeError: unsupported callable
I know getfullargspec() is threatened with deprecation (#108901, #76371), but over at Django we're going to need to build a "safe" version of this function (or migrate away from it entirely) unless an upstream patch makes more sense.
I presume that's either:
- always passing through
annotationlib.Format.FORWARDREF to inspect.Signature
- exposing an argument
Defensively always using FORWARDREF or similar seems simplest. Happy to provide a PR.
CPython versions tested on:
3.14
Operating systems tested on:
macOS
Linked PRs
Bug report
Bug description:
inspect.getfullargspecisn't compatible with 3.14 signatures that depend on deferred evaluation of annotations, and doesn't expose an argument to pass throughannotationlib.Format.FORWARDREFto prevent the failure.I know
getfullargspec()is threatened with deprecation (#108901, #76371), but over at Django we're going to need to build a "safe" version of this function (or migrate away from it entirely) unless an upstream patch makes more sense.I presume that's either:
annotationlib.Format.FORWARDREFto inspect.SignatureDefensively always using
FORWARDREFor similar seems simplest. Happy to provide a PR.CPython versions tested on:
3.14
Operating systems tested on:
macOS
Linked PRs