def get_imports_for_annotation(anno: Any) -> ImportMap:
"""Return the imports (module, name) needed for the type in the annotation"""
imports = ImportMap()
if (
anno is inspect.Parameter.empty or
anno is inspect.Signature.empty or
not isinstance(anno, (type, _Any, _Union)) or
anno.__module__ == 'builtins'
):
return imports
if isinstance(anno, _Any):
imports['typing'].add('Any')
elif _is_optional(anno):
imports['typing'].add('Optional')
elem_type = _get_optional_elem(anno)
elem_imports = get_imports_for_annotation(elem_type)
imports.merge(elem_imports)
elif isinstance(anno, (_Union, GenericMeta)):
if isinstance(anno, _Union):
imports['typing'].add('Union')
else:
name = _get_import_for_qualname(anno.__qualname__)
imports[anno.__module__].add(name)
elem_types = anno.__args__ or []
for et in elem_types:
elem_imports = get_imports_for_annotation(et)
imports.merge(elem_imports)
else:
name = _get_import_for_qualname(anno.__qualname__)
imports[anno.__module__].add(name)
return imports
评论列表
文章目录