我正在使用ast模块来解析Python模块中的文档字符串,以将我们的文档转换为可读取的docs格式。我正在使用以下代码将函数名称和文档字符串放入字典的列表中,其余的代码可以很好地使用该字典。我也在寻找一些东西来获取函数的参数:
good_file = (file for file in os.listdir() if file[-3:] == '.py' and file != '__init__.py')
functions = []
for file in good_file:
with open(file, 'r') as f:
module = ast.parse(f.read())
for node in module.body:
if isinstance(node, ast.FunctionDef):
entry = {"docs": ast.get_docstring(node), "fn_name": node.name, "params": ???}
functions.append(entry)
我正在寻找可用于将函数的参数填充到dict中的内容。谢谢!
最佳答案
Abstract Grammar section of the ast
documentation告诉您在FunctionDef
节点中哪里可以找到参数定义:
stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns)
在参数中是一个
type name
条目序列;名称成为节点上的属性。这些类型在文档中进一步介绍(顶部列出了几种“内置”类型,它们反映为Python字符串和整数)。后面带有*
的类型是序列(列表),问号表示可以将它们设置为None
。因此,每个
FunctionDef
节点都具有name
,args
,body
,decorator_list
和returns
属性。 args
属性是类型为arguments
的新节点,也已记录在案:arguments = (arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults,
arg? kwarg, expr* defaults)
因此
FunctionDef.args.args
是参数列表,每个参数都是arg
对象,依此类推。arg
记录为arg = (identifier arg, expr? annotation)
attributes (int lineno, int col_offset)
其中
identifier
是内置类型,因此这里只是一个字符串。您可能希望查看
ast.dump()
function,它将为您快速概述AST节点:>>> source = """def foo(bar, baz=None, *args, **kwargs): pass"""
>>> module = ast.parse(source)
>>> ast.dump(module)
"Module(body=[FunctionDef(name='foo', args=arguments(args=[arg(arg='bar', annotation=None), arg(arg='baz', annotation=None)], vararg=arg(arg='args', annotation=None), kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kwargs', annotation=None), defaults=[NameConstant(value=None)]), body=[Pass()], decorator_list=[], returns=None)])"
然后,您可以从那里探索并进一步“转储”信息以获得所需的实际数据:
>>> function = module.body[0]
>>> ast.dump(function.args)
"arguments(args=[arg(arg='bar', annotation=None), arg(arg='baz', annotation=None)], vararg=arg(arg='args', annotation=None), kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kwargs', annotation=None), defaults=[NameConstant(value=None)])"
>>> function.args.args
[<_ast.arg object at 0x109852fd0>, <_ast.arg object at 0x109852ef0>]
>>> [a.arg for a in function.args.args]
['bar', 'baz']
默认值附加在
args
或kw_args
序列中的姓氏上(defaults
表示args
,kw_defaults
表示kwonlyargs
); N个默认值的列表,这些默认值附加到args
或kwosnlyargs
中的最后N个名称。所有通用名称(在我的示例中为*args
和**kwargs
)被单独列出。