如何通过 AST 获取第一个函数调用参数?
How to get the first function call argument via AST?
我正在尝试从函数调用中获取参数。例如我们有这样的函数调用示例:
self.assertEqual(dictlike.fromkeys('a'), {'a':None})
我使用这样的代码:
import ast
class CallVisitor(ast.NodeVisitor):
def visit_Call(self, node):
print('Node type: Call\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_Name(self, node):
print('Node type: Name\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_Constant(self, node):
print('Node type: Constant\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_keyword(self, node):
print('Node type: keyword\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_FunctionDef(self,node):
print('Node type: FunctionDef\nFields:', node.fields)
ast.NodeVisitor.generic_visit(self, node)
if __name__ == '__main__':
source = """self.assertEqual(dictlike.fromkeys('a'), {'a':None})"""
root = ast.parse(source)
for node in ast.walk(root):
if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store):
print(node.id)
elif isinstance(node, ast.Attribute):
print(node.attr)
我收到这样的输出:
assertEqual
fromkeys
我也尝试从转储中获取它:
打印(ast.dump(节点))
但我没有设法获得某些字段:
Module(body=[Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='assertEqual', ctx=Load()), args=[Call(func=Attribute(value=Name(id='dictlike', ctx=Load()), attr='fromkeys', ctx=Load()), args=[Constant(value='a', kind=None)], keywords=[]), Dict(keys=[Constant(value='a', kind=None)], values=[Constant(value=None, kind=None)])], keywords=[]))], type_ignores=[])
比如我试过这样的方式:
print(node.args[0])
最后我想收到:
dictlike.fromkeys('a')
也许我做错了什么?
假设您正尝试从源代码中的断言测试用例中提取参数,您可以使用 ast.walk
:
import ast
source = """self.assertEqual(dictlike.fromkeys('a'), {'a':None})"""
r = [[*map(ast.unparse, i.args+i.keywords)] for i in ast.walk(ast.parse(source))
if isinstance(i, ast.Call) and getattr(i.func, 'attr', '').startswith('assert')]
输出:
[["dictlike.fromkeys('a')", "{'a': None}"]]
我正在尝试从函数调用中获取参数。例如我们有这样的函数调用示例:
self.assertEqual(dictlike.fromkeys('a'), {'a':None})
我使用这样的代码:
import ast
class CallVisitor(ast.NodeVisitor):
def visit_Call(self, node):
print('Node type: Call\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_Name(self, node):
print('Node type: Name\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_Constant(self, node):
print('Node type: Constant\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_keyword(self, node):
print('Node type: keyword\nFields: ', node._fields)
ast.NodeVisitor.generic_visit(self, node)
def visit_FunctionDef(self,node):
print('Node type: FunctionDef\nFields:', node.fields)
ast.NodeVisitor.generic_visit(self, node)
if __name__ == '__main__':
source = """self.assertEqual(dictlike.fromkeys('a'), {'a':None})"""
root = ast.parse(source)
for node in ast.walk(root):
if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store):
print(node.id)
elif isinstance(node, ast.Attribute):
print(node.attr)
我收到这样的输出:
assertEqual
fromkeys
我也尝试从转储中获取它: 打印(ast.dump(节点))
但我没有设法获得某些字段:
Module(body=[Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='assertEqual', ctx=Load()), args=[Call(func=Attribute(value=Name(id='dictlike', ctx=Load()), attr='fromkeys', ctx=Load()), args=[Constant(value='a', kind=None)], keywords=[]), Dict(keys=[Constant(value='a', kind=None)], values=[Constant(value=None, kind=None)])], keywords=[]))], type_ignores=[])
比如我试过这样的方式:
print(node.args[0])
最后我想收到:
dictlike.fromkeys('a')
也许我做错了什么?
假设您正尝试从源代码中的断言测试用例中提取参数,您可以使用 ast.walk
:
import ast
source = """self.assertEqual(dictlike.fromkeys('a'), {'a':None})"""
r = [[*map(ast.unparse, i.args+i.keywords)] for i in ast.walk(ast.parse(source))
if isinstance(i, ast.Call) and getattr(i.func, 'attr', '').startswith('assert')]
输出:
[["dictlike.fromkeys('a')", "{'a': None}"]]