def visit_Call(self, node):
fields = {k: v for k, v in ast.iter_fields(node) if v}
self.visit(fields[Const.func])
name, args, kwargs = self.data.pop(), list(), collections.OrderedDict()
func = SyntaxAstCallExtender.find_deserializer(name)
if not func:
raise SyntaxError("%s is not supported" % name)
if Const.args in fields:
for arg in fields[Const.args]:
self.visit(arg)
args.append(self.data.pop())
if Const.keywords in fields:
for keyword in fields[Const.keywords]:
(_, key), (_, value) = ast.iter_fields(keyword)
self.visit(value)
kwargs[key] = self.data.pop()
if Const.kwargs in fields:
(_, knodes), (_, vnodes) = ast.iter_fields(fields[Const.kwargs])
for knode, vnode in zip(knodes, vnodes):
self.visit(knode)
key = self.data.pop()
self.visit(vnode)
value = self.data.pop()
kwargs[key] = value
obj = func(*args, **kwargs)
self.data.append(obj)
评论列表
文章目录