Это необычная вещь, но есть одно решение:
from z3 import *
def functionFromExpr(args, expr):
return lambda *fargs: substitute(expr, zip (args, fargs))
x, y = Ints ('x y')
expr = x + y
f = functionFromExpr([x, y], expr)
print (f (x, y))
print (f (x, IntVal(4)))
print (f (IntVal(3), IntVal(4)))
Это печатает:
x + y
x + 4
3 + 4
Обратите внимание, что вам нужно явно передать выражения, соответствующим образом преобразовав ихсебя на сайте вызова.Если вы хотите избежать этого, вместо этого вы можете сделать следующее:
def mkExpr(a):
if is_expr(a):
return a
elif isinstance(a, int):
return IntVal(a)
elif isinstance(a, float):
return FPVal(a)
else:
raise Exception("Don't know how to convert: %s" % a.__repr__())
def functionFromExpr(args, expr):
return lambda *fargs: substitute(expr, zip (args, [mkExpr(e) for e in fargs]))
x, y = Ints ('x y')
expr = x + y
f = functionFromExpr([x, y], expr)
print (f (x, y))
print (f (x, 4))
print (f (3, 4))
Очевидно, вам придется соответствующим образом изменить mkExpr
для обработки всех видов констант, которые вы можете передавать.