def eval(cls, *args): obj = Expr.__new__(cls, *args) #use dummy variables internally, just to be sure nargs = len(args) - 1 expression = args[nargs] funargs = [C.Symbol(arg.name, dummy=True) for arg in args[:nargs]] #probably could use something like foldl here for arg, funarg in zip(args[:nargs], funargs): expression = expression.subs(arg, funarg) funargs.append(expression) obj._args = tuple(funargs) return obj