def parse_call_args(defnode, array_var, call_args, prev_dimensions):
"""
try split call_args into multiple dimensions
"""
if isinstance(py_ast.get_ast(call_args).body[0].value, (ast.List, ast.Tuple)):
call_args = call_args[1 : -1]
dimensions = call_args.split(',')
for i in range(len(dimensions)):
dimension = dimensions[i]
try:
d_node = py_ast.get_ast(dimension.strip()).body[0].value
if isinstance(d_node, ast.BinOp):
if isinstance(d_node.op, (ast.Add, ast.Sub)):
if isinstance(d_node.left, ast.Num) and not isinstance(d_node.right, ast.Num):
dimensions[i] = py_ast.dump_ast(d_node.right)
elif isinstance(d_node.right, ast.Num) and not isinstance(d_node.left, ast.Num):
dimensions[i] = py_ast.dump_ast(d_node.left)
else:
dimensions[i] = py_ast.dump_ast(d_node)
else:
dimensions[i] = py_ast.dump_ast(d_node)
else:
dimensions[i] = py_ast.dump_ast(d_node)
except:
pass
prev_dimensions.append(dimensions)
else:
arg_node = py_ast.get_ast(call_args).body[0].value
if isinstance(arg_node, ast.Attribute):
if arg_node.attr == 'shape':
arg_shape_var = py_ast.dump_ast(arg_node.value)
try:
(shape_assignnode, shape_call_args, shape_assign_funcname) = preallocate_find_assignnode_py_ast(defnode, defnode.name, arg_shape_var)
prev_dimensions.append([call_args])
prev_dimensions = parse_call_args(defnode, arg_shape_var, shape_call_args, prev_dimensions)
except PreallocateNotFound:
dimensions = [call_args]
prev_dimensions.append(dimensions)
else:
dimensions = [call_args]
prev_dimensions.append(dimensions)
return prev_dimensions
评论列表
文章目录