我需要将 类型提示作为字符串。正是它在Pylint中的样子。
例子:
def pull_type(tp: type) -> str: ... # CODE
pull_type(Optional[int]) # 'int | None'
pull_type(Union[str, bytes]) # 'str | bytes'
pull_type(str) # 'str'
pull_type(Literal["name", "id", "desc"]) # 'Literal["name", "id", "desc"]'
我花了很多时间搜索,进入了pylint、pydoc、astroid(pylint 将其作为依赖项)。 我搜索了他们每个人的文档。 但结果我没有发现任何有用的东西。
我想找到一个现成的解决方案,而不是创建一个完整的模块来处理 Optional、List、Union、Tuple 等等。
实现此目的的一种方法是使用
typing_inspect
模块,这是一个第三方包,提供用于使用 Python 的输入模块的工具。您可以使用 typing_inspect.get_type_hints()
函数获取给定函数的类型提示,然后使用 typing_inspect.format_type()
函数将类型提示格式化为与 Pylint 相同格式的字符串。
这里是使用 typing_inspect 的
pull_type()
函数的示例实现:
from typing import Optional, List, Tuple, Union, Literal
import typing_inspect
def pull_type(tp: type) -> str:
if typing_inspect.is_optional_type(tp):
return f"{pull_type(typing_inspect.get_optional_type(tp))} | None"
elif typing_inspect.is_union_type(tp):
return " | ".join(pull_type(arg) for arg in typing_inspect.get_args(tp))
elif typing_inspect.is_tuple_type(tp):
return f"Tuple[{', '.join(pull_type(arg) for arg in typing_inspect.get_args(tp))}]"
elif typing_inspect.is_list_type(tp):
return f"List[{pull_type(typing_inspect.get_args(tp)[0])}]"
elif typing_inspect.is_literal_type(tp):
return f"Literal[{', '.join(repr(arg) for arg in typing_inspect.get_args(tp))}]"
else:
return tp.__name__
# Example usage
print(pull_type(Optional[int])) # 'int | None'
print(pull_type(Union[str, bytes])) # 'str | bytes'
print(pull_type(str)) # 'str'
print(pull_type(Tuple[int, str, float])) # 'Tuple[int, str, float]'
print(pull_type(List[str])) # 'List[str]'
print(pull_type(Literal["name", "id", "desc"])) # 'Literal["name", "id", "desc"]'
请注意,此实现仅处理 Optional、Union、Tuple、List 和 Literal 类型,但您可以轻松扩展它以处理其他类型。