`NameError` из `inspect.signature()` или `obj.__annotations__` для типов, присутствующих только в блоке `TYPE_CHECKING`Python

Программы на Python
Ответить
Anonymous
 `NameError` из `inspect.signature()` или `obj.__annotations__` для типов, присутствующих только в блоке `TYPE_CHECKING`

Сообщение Anonymous »

Я использую Inspect.signature(), чтобы получить сигнатуру функции в виде строки для создания некоторой документации вручную, и получаю ошибку NameError.
У меня есть этот минимальный скрипт Python для воспроизведения моей проблемы:

Код: Выделить всё

from typing import TYPE_CHECKING
from inspect import signature

if TYPE_CHECKING:
from types import TracebackType

def some_function(tb_param: TracebackType) -> str:
return 'this is actually not important'

print(signature(some_function))
# Happens with this, too: print(some_function.__annotations__)
Я получаю ошибку NameError, потому что TracebackType определен только в блоке TYPE_CHECKING (что я делаю, потому что, помимо прочего, он необходим только для типа, аннотирующего функцию):

Код: Выделить всё

Traceback (most recent call last):
File "C:\Users\rauln\Desktop\t.py", line 11, in 
print(signature(some_function))
~~~~~~~~~^^^^^^^^^^^^^^^
File "C:\Users\rauln\AppData\Local\Python\pythoncore-3.14-64\Lib\inspect.py", line 3321, in signature
return Signature.from_callable(obj, follow_wrapped=follow_wrapped,
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
globals=globals, locals=locals, eval_str=eval_str,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
annotation_format=annotation_format)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\rauln\AppData\Local\Python\pythoncore-3.14-64\Lib\inspect.py", line 3036, in from_callable
return _signature_from_callable(obj, sigcls=cls,
follow_wrapper_chains=follow_wrapped,
globals=globals, locals=locals, eval_str=eval_str,
annotation_format=annotation_format)
File "C:\Users\rauln\AppData\Local\Python\pythoncore-3.14-64\Lib\inspect.py", line 2511, 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 "C:\Users\rauln\AppData\Local\Python\pythoncore-3.14-64\Lib\inspect.py", line 2334, in _signature_from_function
annotations = get_annotations(func, globals=globals, locals=locals, eval_str=eval_str,
format=annotation_format)
File "C:\Users\rauln\AppData\Local\Python\pythoncore-3.14-64\Lib\annotationlib.py", line 957, in get_annotations
ann = _get_dunder_annotations(obj)
File "C:\Users\rauln\AppData\Local\Python\pythoncore-3.14-64\Lib\annotationlib.py", line 1137, in _get_dunder_annotations
ann = getattr(obj, "__annotations__", None)
File "C:\Users\rauln\Desktop\t.py", line 8, in __annotate__
def some_function(tb_param: TracebackType) -> str:
^^^^^^^^^^^^^
NameError: name 'TracebackType' is not defined
Конечно, проблема исчезнет, если я заменю аннотацию типа строковым литералом или если я использую аннотации импорта from __future__, но я бы предпочел этого не делать, если я могу этого избежать.
Другое решение — использовать Inspect.signature(obj, annotation_format=Format.STRING), но мне это кажется решением, которое я бы использовал, потому что я не до конца понимаю суть проблемы.
Есть ли какой-нибудь стандартный способ избавиться от этой ошибки без строковых литералов? Должен ли я использовать другой метод получения подписи?

Подробнее здесь: https://stackoverflow.com/questions/798 ... pes-presen
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»