def reflected_binary_operator(op): """ Factory function for making binary operator methods on a Factor. Returns a function, "reflected_binary_operator" suitable for implementing functions like __radd__. """ assert not is_comparison(op) def reflected_binary_operator(self, other): if isinstance(self, NumericalExpression): self_expr, other_expr, new_inputs = self.build_binary_op(op, other) return NumExprFactor( "({left}) {op} ({right})".format( left=other_expr, right=self_expr, op=op, ), new_inputs, ) # Only have to handle the numeric case because in all other valid cases # the corresponding left-binding method will be called. elif isinstance(other, NUMERIC_TYPES): return NumExprFactor( "{constant} {op} x_0".format(op=op, constant=other), binds=(self, ), ) raise BadBinaryOperator(op, other, self) return reflected_binary_operator
def reflected_binary_operator(op): """ Factory function for making binary operator methods on a Factor. Returns a function, "reflected_binary_operator" suitable for implementing functions like __radd__. """ assert not is_comparison(op) def reflected_binary_operator(self, other): if isinstance(self, NumericalExpression): self_expr, other_expr, new_inputs = self.build_binary_op( op, other ) return NumExprFactor( "({left}) {op} ({right})".format( left=other_expr, right=self_expr, op=op, ), new_inputs, ) # Only have to handle the numeric case because in all other valid cases # the corresponding left-binding method will be called. elif isinstance(other, NUMERIC_TYPES): return NumExprFactor( "{constant} {op} x_0".format(op=op, constant=other), binds=(self,), ) raise BadBinaryOperator(op, other, self) return reflected_binary_operator
def binop_return_type(op): if is_comparison(op): return NumExprFilter else: return NumExprFactor