Composing Functions
Credit: Scott David Daniels
Problem
You need to construct a new function by composing existing functions (i.e., each call of the new function must call one existing function on its arguments, then another on the result of the first one).
Solution
Composition is a fundamental
operation between functions that yields a new function as a
result—the new function must call one existing function on its
arguments, then another on the result of the first one. For example,
a function that, given a string, returns a copy that is lowercase and
does not have leading and trailing blanks, is the composition of the
existing string.lower and
string.trim functions (in this case, it does not
matter in which order the two existing functions are applied, but
generally, it could be important). A class defining the special
method _ _call_ _ is often the best Pythonic approach to
constructing new functions:
class compose: '''compose functions. compose(f,g,x...)(y...) = f(g(y...),x...))''' def _ _init_ _(self, f, g, *args, **kwargs): self.f = f self.g = g self.pending = args[:] self.kwargs = kwargs.copy( ) def _ _call_ _(self, *args, **kwargs): return self.f(self.g(*args, **kwargs), *self.pending, **self.kwargs) class mcompose(compose): '''compose functions. mcompose(f,g,x...)(y...) = f(*g(y...),x...))''' TupleType = type(( )) def _ _call_ _(self, *args, **kwargs): mid = self.g(*args, **kwargs) if isinstance(mid, self.TupleType): return self.f(*(mid + self.pending), **self.kwargs) return ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access