Python 将类型提示字符串表示形式(来自文档字符串)转换为实际类型/打字对象

标签 python type-hinting docstring

我想知道是否有一个现有的实现可以将类型提示的字符串表示形式(例如从文档字符串)转换回类型(或打字)对象。因此,还应该支持任意深度嵌套类型(参见第三个示例)。

import typing import List, Optional, Union

converter_function("List[str]") == List[str]

converter_function("int") == int

converter_function("Optional[List[Union[str, float]]]") == Optional[List[Union[str,float]]]

converter_function("foobar") # Exception / None

一种选择是简单地使用 eval,但我想不惜一切代价避免这种情况:D

编辑 作为我为什么要这样做的背景:我想编写一个脚本来检查文档字符串是否与函数 100% 匹配、所有类型是否正确等等。

最佳答案

我能找到的最接近的东西(当然除了eval)是typing.get_type_hints。如果您的函数已正确进行类型注释,则 typing.get_type_hints 可以解析注释。它适用于字符串注释、任意嵌套类型和泛型类型;基本上任何有效的注释。例如:

from typing import List, Optional, Union, get_type_hints

def my_func(a: "List[str]", b: "int") -> "Optional[List[Union[str, float]]]":
    pass

print(get_type_hints(my_func))

你会得到

{'a': typing.List[str],
 'b': <class 'int'>,
 'return': typing.Optional[typing.List[typing.Union[str, float]]]}

在内部,get_type_hints 将字符串转换为 typing.ForwardRef,然后对它们进行求值。这些是私有(private) API,因此它们在 Python 版本中可能不稳定,但如果您只有注释字符串而没有函数,您可以尝试一下:

>>> from typing import ForwardRef, _eval_type

>>> _eval_type(ForwardRef("Optional[List[Union[str, float]]]"), globals(), globals())
typing.Optional[typing.List[typing.Union[str, float]]]

但此时,您可能会更好地使用 eval :P

关于Python 将类型提示字符串表示形式(来自文档字符串)转换为实际类型/打字对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67500755/

相关文章:

python - 如何将 svn 存储库内部版本号添加到 Python 代码中?

python - 装饰器和全局变量

python - lxml web-scraping,特定单词提取

autocomplete - 在不导入的情况下在 VSCode 中获取 Javascript 类型提示,这会导致循环依赖

python - python (2.7) unittest 的测试描述如何修改

python - 嵌套文档字符串的 Doctest

python - 借助 hmmlearn Python 库预测 HMM 中的下一个状态

不同类型的 PHPStorm 类型提示数组

php - 多个不相关接口(interface)的类型提示

python - 如何将函数的文档字符串放入变量中?