Как мне найти файл, в котором была объявлена / создана аннотация псевдонима ввода?
Например:
# In a.py
Number = Union[int, float]
Мне нужна функция, которая извлекает, где файл в который изначально был создан псевдонимом ввода:
get_file(Number) == 'path/to/a.py'
Я не могу вызвать inspect.getfile(Number)
, поскольку Number
является экземпляром _GenericAlias
, а не новым классом.
Пример использования для создания документации HTML. Страница Number
do c должна указывать на объявление исходного псевдонима файла.
Действительно упрощенный пример:
from my_types import Number
def f(x: Number):
pass
In document.py
def document_fn(f):
for name, annotation in f.__annotations__.items():
print(f'Annotation declared in {get_file(annotation)}')
Текущие решения, которые я нашел, чтобы найти место создания объекта, потребуют вызова inspect.stack()
в _GenericAlias
конструкторе: Как узнать, где объект был создан в Python?
Думаю, я мог бы попытаться исправить typing._GenericAlias
, чтобы ввести код отслеживания, но я бы очень предпочел избежать этого, поскольку он зависит от деталей реализации.