Skip to content

Expressions

Expressions

In order to achieve the piping, we need to delay the execution of python expressions. pipda turns python expressions, including operators, function calls, getattr, getitem, etc into Expression objects. So they can await the data to be piped in and get evaluated.

A Symbolic object is a root expression that is supposed to be evaluated as the data itself.

An expression can be evaluated manually by expr._pipda_eval(data, context).

f = Symbolic()
f._pipda_eval(1)  # 1

A Symbolic can derive into other Expression objects:

f = Symbolic()
f.a  # ReferenceAttr object
f["a"]  # ReferenceItem object
f.a()  # FunctionCall object
f.a + f.b  # OperatorCall object

numpy ufuncs on Expression objects

import numpy as np
from pipda import Symbolic

f = Symbolic()

x = np.sqrt(f)

x._pipda_eval(4)  # 2.0

Register your own __array_ufunc__

import numpy as np
from pipda import Symbolic, register_array_ufunc


 @register_array_ufunc
 def my_ufunc(ufunc, x, *args, **kwargs):
    return ufunc(x, *args, **kwargs) * 2

f = Symbolic()
x = np.sqrt(f)

x._pipda_eval(4)  # 4.0