Python 找到声明类型别名(例如 Union 等)的文件

Python find the file where a typing alias (e.g. Union,...) is declared

如何找到输入别名注释的文件declared/created?

例如:

# In a.py
Number = Union[int, float]

我想要一个函数来提取最初创建键入别名的文件所在的位置:

get_file(Number) == 'path/to/a.py'

我无法调用 inspect.getfile(Number),因为 Number 是一个 _GenericAlias 实例,而不是新的 class。

一个用例是生成HTML文档。 Number 文档页面应指出原始文件别名声明。

一个真正简化的例子:

from my_types import Number

def f(x: Number):
  pass

document.py

def document_fn(f):
  for name, annotation in f.__annotations__.items():
    print(f'Annotation declared in {get_file(annotation)}')

我发现当前找到对象创建位置的解决方案需要在 _GenericAlias 构造函数中调用 inspect.stack()How to know where an object was instantiated in Python?

我想我可以尝试修补 typing._GenericAlias 以注入跟踪代码,但我强烈希望避免这种情况,因为它依赖于实现细节。

你想要的信息没有被追踪到任何地方。您最好的选择可能是静态检查源代码,而不导入它或根本不实际生成 _GenericAlias。 (静态检查是类型注释的主要和最受支持的用例。)