skrub.Expr.skb.match#

Expr.skb.match(targets, default=NULL)[source]#

Select based on the value of an expression.

Evaluate self, then compare the result to the keys in targets. If there is a match, evaluate the corresponding value and return it. If there is no match and default has been provided, evaluate and return default. Otherwise, a KeyError is raised.

Therefore, only one of the branches or the default is evaluated which is the main advantage compared to placing the selection inside a @skrub.deferred function.

Parameters:
targetsdict

A dictionary providing which result to select. The keys must be actual values, they cannot be expressions. The values can be expressions or any object.

defaultobject, optional

If provided, the match falls back to the default when none of the targets have matched.

Returns:
The value corresponding to the matching key or the default

See also

skrub.deferred

Wrap function calls in an expression Expr.

Examples

>>> import skrub
>>> a = skrub.var("a")
>>> mode = skrub.var("mode")
>>> @skrub.deferred
... def mul(value, factor):
...     result = value * factor
...     print(f"{value} * {factor} = {result}")
...     return result
>>> b = mode.skb.match(
...     {"one": mul(a, 1.0), "two": mul(a, 2.0), "three": mul(a, 3.0)},
...     default=mul(a, -1.0),
... )
>>> b.skb.eval({"a": 10.0, "mode": "two"})
10.0 * 2.0 = 20.0
20.0
>>> b.skb.eval({"a": 10.0, "mode": "three"})
10.0 * 3.0 = 30.0
30.0
>>> b.skb.eval({"a": 10.0, "mode": "twenty"})
10.0 * -1.0 = -10.0
-10.0

Note that only one of the multiplications gets evaluated.