是否有现成函数将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
相关产品推荐
相关产品推荐

