You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有现成函数将docstring转换为字典?求相关实现经验

问题

请问有没有现成的函数可以把docstring转换成字典?另外有没有开发者有类似经验,能提取不同对象的赋值信息并转换成指定的字典格式?

比如通过getattr(obj,'__doc__')获取到的如下docstring:

Keyword arguments
-----------------
name : str
     (default "")
description : str
     (default "")
_id : str
     (default "")
script : str
     (default "")
dependencies : List[Dependency]
cyclic : bool
     (default False)
feature : str
     (default "")
index : int
  (default -1)

或者赋值给变量docstr的内容:

docstr = '\n    Keyword arguments\n    -----------------\n    name : str\n         (default "")\n    description : str\n         (default "")\n    _id : str\n         (default "")\n    script : str\n         (default "")\n    dependencies : List[Dependency]\n    cyclic : bool\n         (default False)\n    feature : str\n         (default "")\n    index : int\n         (default -1)\n    '

需要转换成这样的字典格式:

adict = {'name' : str,
         'description' : str,
         '_id' : str,
         'script' : str,
         'dependencies' : List[Dependency],
         'cyclic' : bool,
         'feature' : str,
         'index' : int,
        }
解决方案

一、用现成库快速解决:docstring-parser

推荐用docstring-parser这个专门做docstring解析的库,它支持numpy、google等多种风格的docstring,能直接提取参数信息,转成字典很方便。

先安装:

pip install docstring-parser

使用示例:

from docstring_parser import parse
import inspect

# 解析对象obj的docstring,或直接用你定义的docstr变量
doc = parse(inspect.getdoc(obj))  # 替换成parse(docstr)也可

param_dict = {}
for param in doc.params:
    # 用eval把类型字符串转成实际类型对象,若只需类型名称字符串,直接用param.type_name即可
    param_dict[param.arg_name] = eval(param.type_name) if param.type_name else None

print(param_dict)

注意:eval要谨慎使用,需确保docstring中的类型内容安全可信,避免恶意代码注入。

二、自定义解析函数(无需第三方库)

如果不想额外安装库,针对你提供的这种特定格式的docstring,可以写个简单的解析函数:

def docstr_to_dict(docstr):
    # 提取所有有效行,去除空行和前后空格
    lines = [line.strip() for line in docstr.split('\n') if line.strip()]
    # 定位到参数部分的起始位置
    start_idx = lines.index("Keyword arguments") + 2
    param_dict = {}
    
    for line in lines[start_idx:]:
        if ':' in line:
            # 拆分参数名和类型
            name, type_str = line.split(':', 1)
            # 转成实际类型对象,若只需字符串则去掉eval
            param_dict[name.strip()] = eval(type_str.strip())
        # 默认值行直接跳过
    
    return param_dict

# 调用示例
adict = docstr_to_dict(docstr)
print(adict)

三、提取不同对象的赋值信息

如果要提取类、实例等对象的赋值信息生成字典,可以结合inspect模块实现:

  • 对于类或实例,用inspect.getmembers获取成员,过滤出属性变量
  • 对于函数参数,用inspect.signature提取参数,再结合docstring补全类型

提取类属性的示例:

import inspect

class MyClass:
    name: str = ""
    description: str = ""
    _id: str = ""

def get_obj_attr_dict(obj):
    attr_dict = {}
    for name, value in inspect.getmembers(obj):
        # 跳过私有属性,仅处理公开属性
        if not name.startswith('_'):
            try:
                attr_dict[name] = type(value)
            except:
                continue
    return attr_dict

print(get_obj_attr_dict(MyClass()))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:05:40