Open Parnassius opened 2 months ago
Can replicate it on main
:
» ./python.exe ex.py
Traceback (most recent call last):
File "/Users/sobolev/Desktop/cpython2/ex.py", line 9, in <module>
print(typing.get_type_hints(Test.foo))
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/Users/sobolev/Desktop/cpython2/Lib/typing.py", line 2465, in get_type_hints
hints[name] = _eval_type(value, globalns, localns, type_params, format=format, owner=obj)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/sobolev/Desktop/cpython2/Lib/typing.py", line 481, in _eval_type
return evaluate_forward_ref(t, globals=globalns, locals=localns,
type_params=type_params, owner=owner,
_recursive_guard=recursive_guard, format=format)
File "/Users/sobolev/Desktop/cpython2/Lib/typing.py", line 1073, in evaluate_forward_ref
value = forward_ref.evaluate(globals=globals, locals=locals,
type_params=type_params, owner=owner)
File "/Users/sobolev/Desktop/cpython2/Lib/annotationlib.py", line 152, in evaluate
value = eval(code, globals=globals, locals=locals)
File "<string>", line 1, in <module>
NameError: name 'M' is not defined
I will take a look, thanks for the report.
From the first sight - there's not much of what can be done, because Test.foo
does not have any refences to Test
and has a type <function>
. It also does not have any __type_params__
set. And __annotate__
of <function>
does not even get called.
There are literally no ways of accessing Test.__type_params__
from Test.foo
that I am aware of.
Except for this piece of hackery: obj.__globals__[obj.__qualname__.split('.')[0]].__type_params__
But, I don't think that it is good enough.
I think that we might need some special handling for this.
I don't think we should change anything here. from __future__ import annotations
does not interact well with runtime introspection, and that's a major part of why in Python 3.14 we're likely to deprecate it (PEP-749).
In the meantime, if you want reliable runtime introspection, don't use from __future__ import annotations
.
Bug report
Bug description:
This seems very similar to #114053, but with class methods (or instance methods, the result is the same) instead of classes themselves.
Removing the
from __future__ import annotations
import works fine:Using the pre PEP-695 syntax, with or without
from __future__ import annotations
, works fine as well:This happens on both 3.12.5 and 3.13.0rc2
CPython versions tested on:
3.12, 3.13
Operating systems tested on:
Linux