def parse_node(cls, node):
normal_args = cls.get_arg_tuples(node.args.args, node.args.defaults)
kwonlyargs = cls.get_arg_tuples(node.args.kwonlyargs, node.args.kw_defaults)
# TODO: all single args should be tuples like this
vararg = cls.get_arg(node.args.vararg)
kwarg = cls.get_arg(node.args.kwarg)
# create context variables
target_vars = [arg[0] for arg in normal_args]
if vararg: target_vars.append(vararg)
if kwarg: target_vars.append(kwarg)
args = cls.get_arg_parts(node.args.args, node.args.defaults, 'arg')
kw_args = cls.get_arg_parts(node.args.kwonlyargs, node.args.kw_defaults, 'kwonly')
varargs = cls.get_arg_part(node.args.vararg, None, 'vararg')
kwargs = cls.get_arg_part(node.args.kwarg, None, 'kwarg')
all_args = [*args, varargs, *kw_args, kwargs]
if isinstance(node, ast.Lambda): body_node = node.body
else: body_node = FunctionBodyTransformer().visit(ast.Module(node.body))
return {
"node": node,
"name": getattr(node, 'name', None),
"args": IndexedDict([ (p['name'], p) for p in all_args if p is not None]),
# TODO: arg is the node counterpart to target_vars
"_spec1_args": args,
"*args": varargs,
"**kwargs": kwargs,
"body": {'node': body_node,
'target_vars': TargetVars(target_vars)}
}
评论列表
文章目录