gpt4 book ai didi

python - 如何使用 ast 列出函数的参数?

转载 作者:行者123 更新时间:2023-12-02 03:26:28 24 4
gpt4 key购买 nike

我正在使用 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 section of the ast documentation告诉您在 FunctionDef 节点中哪里可以找到参数定义:

stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns)

参数中是一系列类型名称条目;名称成为节点上的属性。文档中进一步介绍了这些类型(顶部列出了几个“内置”类型,它们反射(reflect)为 Python 字符串和整数)。后面带*的类型是序列(列表),问号表示可以设置为None

因此每个 FunctionDef 节点都有 nameargsbodydecorator_list返回属性。 args 属性是一个 arguments 类型的新节点,也记录在案:

arguments = (arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults,
arg? kwarg, expr* defaults)

so 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']

默认值附加到 argskw_args 序列中的姓氏(defaults for argskw_defaultskwonlyargs);附加到 argskwosnlyargs 中最后 N 个名称的 N 个默认值列表。任何包罗万象的名称(在我的示例中为 *args**kwargs)均单独列出。

关于python - 如何使用 ast 列出函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com