python - 如何使用 ast 列出函数的参数?
问题描述
我正在使用 ast 模块来解析 Python 模块中的文档字符串,以将我们的文档转换为读取文档格式。我正在使用以下内容将函数名称和文档字符串放入字典列表中,我的其余代码可以很好地使用这些字典。我也在寻找一些东西来获取函数的参数:
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)
我正在寻找可以用来将函数的参数填充到字典中的内容。谢谢!
解决方案
文档的Abstract Grammar部分ast
告诉您在哪里可以找到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)
whereidentifier
是一个内置类型,所以这里只是一个字符串。
您可能想查看ast.dump()
函数,它可以让您快速了解 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
默认值附加到orkw_args
序列中的姓氏( defaults
for args
,kw_defaults
for kwonlyargs
);附加到args
或中的最后 N 个名称的 N 个默认值列表kwosnlyargs
。任何包罗万象的名称(*args
在**kwargs
我的示例中)都单独列出。
推荐阅读
- f# - Socrata 托管数据集的 OData 类型提供程序问题
- python - 试图抓取页面上所有鞋子的网站,但一直返回 None
- visual-studio - 汇编程序在调用或退出时崩溃
- vba - 如何将一张桌子直接放在另一张桌子上
- python-2.7 - Python/sqlite3:有没有办法制作数据库模式图?
- c# - 尝试将文件从 UWP 应用程序上传到烧瓶 restful web api,失败
- javafx - 如何在 JavaFX 的 MenuButton 中创建子菜单?
- html - 如何让图片填充整个容器,在 Bootstrap 中保持适当的纵横比?
- dart - 在 null 上调用了方法“post”
- sql - 从状态变化数据中获取每日快照的 SQL 查询