You want to replace the `Add` ast with a `Call` ast rather than just calling your function.
Something like: if isinstance(node.op, ast.Add): return ast.Call(some_ast_expression_that_will_evaluate_to_op, [node.left, node.right], []) You'll have to replace some_ast_expression_... to something like Name(id="op2", ctx=ast.Load()) and inject op2 in the globals when you call `exec`. On Tue, Nov 1, 2016, 06:36 meInvent bbird <jobmatt...@gmail.com> wrote: > would like to change Add operator to custom function op2 in solve function > and then this solve([x*y - 1, x + 2], x, y) > during solve, the parameters also change Add to custom function op2 > > import ast > from __future__ import division > from sympy import * > x, y, z, t = symbols('x y z t') > k, m, n = symbols('k m n', integer=True) > f, g, h = symbols('f g h', cls=Function) > import inspect > > def op2(a,b): > return a*b+a > > class ChangeAddToMultiply(ast.NodeTransformer): > """Wraps all integers in a call to Integer()""" > def visit_BinOp(self, node): > print(dir(node)) > print(dir(node.left)) > if isinstance(node.op, ast.Add): > node.op = op2(node.left, node.right) > return node > > code = inspect.getsourcelines(solve) > tree = ast.parse(code) > tree = ChangeAddToMultiply().visit(tree) > ast.fix_missing_locations(tree) > co = compile(tree, '<ast>', "exec") > > exec(code) > exec(co) > -- > https://mail.python.org/mailman/listinfo/python-list > -- Yann Kaiser kaiser.y...@gmail.com yann.kai...@efrei.net +33 6 51 64 01 89 https://github.com/epsy -- https://mail.python.org/mailman/listinfo/python-list