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
。 (静态检查是类型注释的主要和最受支持的用例。)
如何找到输入别名注释的文件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
。 (静态检查是类型注释的主要和最受支持的用例。)