【问题标题】:Python convert type hint string representation (from docstring) to actual type/typing objectPython 将类型提示字符串表示(从 docstring)转换为实际的类型/键入对象
【发布时间】:2021-08-02 15:30:58
【问题描述】:

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

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% 匹配,所有类型是否正确等等。

【问题讨论】:

  • 我不确定是否有这样的东西,但我很好奇你需要它的原因。你有具体的例子或用例吗? @g3n35i5
  • @KutayAslan 我已经更新了我的问题,希望能回答你的问题 :)

标签: python type-hinting docstring


【解决方案1】:

我能找到的最接近的东西(当然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.ForwardRefs,然后对它们求值。这些是私有 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

【讨论】:

  • 太好了,这正是我想要的!感谢您的回答。我想我必须接受 API 可能不稳定。替代的“eval”肯定会伤害更多:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多