You need to enable JavaScript to run this app. Python中将docstring类型提示字符串转为typing类型对象的实现方案
优惠活动
大模型
产品
解决方案
定价
更多

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行:

  1. 用ast.parse把类型字符串解析为AST节点
  2. 递归处理节点:
    • ast.Name节点:映射到内置类型或typing模块下的对应对象
    • ast.Subscript节点:处理泛型嵌套,拿到外层泛型和内层参数后拼接为对应泛型类型
    • ast.Tuple节点:处理Union、多参数泛型的参数列表
      整个过程完全不需要执行动态代码,没有安全隐患。

适配你的校验需求

如果要做docstring和函数定义的类型匹配校验,可以先通过docstring_parser提取docstring中的参数、返回值类型字符串,转换为类型对象后直接和函数__annotations__属性中的类型做等值判断即可。

内容的提问来源于stack exchange,提问作者g3n35i5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 15:15:01