Python中将docstring类型提示字符串转为typing类型对象的实现方案
解决方案
现成可选实现
用pydantic的TypeAdapter(推荐,无需自己造轮子)
pydantic 2.x 内置的TypeAdapter可以安全解析类型字符串,底层基于AST语法解析,完全规避eval的安全风险,支持任意深度的嵌套泛型,兼容PEP 484、PEP 585等所有标准类型语法。
用法示例:
from typing import List, Optional, Union from pydantic import TypeAdapter def type_str_converter(type_str: str): try: # 返回完整泛型类型对象用.annotation属性 return TypeAdapter(type_str).annotation except Exception: return None # 测试用例 assert type_str_converter("List[str]") == List[str] assert type_str_converter("int") == int assert type_str_converter("Optional[List[Union[str, float]]]") == Optional[List[Union[str, float]]] assert type_str_converter("foobar") is None
这个方案已经覆盖了几乎所有常用类型场景,包括新的内置泛型写法如list[str]也能正常识别。
基于内置ast模块自主实现
如果不想引入第三方依赖,可以自己通过Python内置的ast模块写解析逻辑,核心逻辑不超过100行:
- 用
ast.parse把类型字符串解析为AST节点 - 递归处理节点:
ast.Name节点:映射到内置类型或typing模块下的对应对象ast.Subscript节点:处理泛型嵌套,拿到外层泛型和内层参数后拼接为对应泛型类型ast.Tuple节点:处理Union、多参数泛型的参数列表
整个过程完全不需要执行动态代码,没有安全隐患。
适配你的校验需求
如果要做docstring和函数定义的类型匹配校验,可以先通过docstring_parser提取docstring中的参数、返回值类型字符串,转换为类型对象后直接和函数__annotations__属性中的类型做等值判断即可。
内容的提问来源于stack exchange,提问作者g3n35i5
相关产品推荐
相关产品推荐

