Skip to content

Operators

Operators

Operators can be redefined with pipda. By default, the operators are from the builtin library operator. The "right" versions (e.g. radd, rsub, etc) are derived from the builtin ones by swapping the operands.

You can define you own operators:

from pipda import Symbolic, Operator, register_operator

f = Symbolic()

@register_operator
class MyOperator(Operator):
    def add(self, x, y):
        return x * y

    def invert(self, x):
        return -x

expr = f["x"] + 10
assert str(expr) == "x + 10"
assert expr._pipda_eval({"x": 3}, Context.EVAL) == 30

expr = 10 * f["x"]
assert str(expr) == "10 * x"
assert expr._pipda_eval({"x": 2}, Context.EVAL) == 20

expr = ~f["x"]
assert str(expr) == "~x"
assert expr._pipda_eval({"x": 2}, Context.EVAL) == -2

register_operator(Operator)

expr = ~f["x"]
assert str(expr) == "~x"
assert expr._pipda_eval({"x": 2}, Context.EVAL) == -3 # ~2