如何获得 str 的类型提示?

问题描述 投票:0回答:1

我需要将 类型提示作为字符串。正是它在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"]'

我花了很多时间搜索,进入了pylintpydocastroid(pylint 将其作为依赖项)。 我搜索了他们每个人的文档。 但结果我没有发现任何有用的东西。

我想找到一个现成的解决方案,而不是创建一个完整的模块来处理 OptionalListUnionTuple 等等。

python typing type-alias
1个回答
0
投票

实现此目的的一种方法是使用

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 类型,但您可以轻松扩展它以处理其他类型。

© www.soinside.com 2019 - 2024. All rights reserved.