python - Python 将类型提示字符串表示(从 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
s,然后评估它们。这些是私有 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 - 了解sklearn QuantileTransformer
- java - 如何通过 frida js 创建一个 Integer.TYPE(int.class) 数组
- python - RGB通道上的Tensorflow 2D卷积分别?
- python - 我正在尝试从网站上抓取,但它给了我一个错误
- c# - 从存储过程中获取数据到模型 EF6 MVC
- mongodb - 在 MongoDB 中保存喜欢/收藏/评论/关注的最佳方法是什么?
- database-design - 如何在具有多个关系的 GraphDb (neo4j) 中对“排序顺序”进行建模?
- angular - 我可以使用 FILE 对象将哪种 mime 类型用于 .MSG 文件
- r - 删除重复值,优先从最大组中删除
- hyperledger-fabric - Hyperledger Fabric 中锚交易文件的目的是什么?