def _translate_node(self, node, in_call=False):
if isinstance(node, ast.AST):
if self.current_constant and type(node) not in [ast.Num, ast.Str, ast.List]:
raise translation_error(
'You can initialize constants only with literals',
(node[0].lineno, node[0].col_offset),
self.lines[node[0].lineno],
right='K = [2, 4]',
wrong='K = [2, x]')
fields = {field: getattr(node, field) for field in node._fields}
l = getattr(node, 'lineno', None)
if l:
fields['location'] = l, node.col_offset
else:
fields['location'] = None
if isinstance(node, ast.Attribute):
fields['in_call'] = in_call
return getattr(self, '_translate_%s' % type(node).__name__.lower())(**fields)
elif isinstance(node, list):
results = []
for n in node:
x = self._translate_node(n)
if isinstance(x, list):
results.extend(x)
else:
results.append(x)
return results
elif isinstance(node, dict):
return {k: self._translate_node(v) for k, v in node.items()}
else:
return node
评论列表
文章目录