You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.4 KiB

"""
Alternate namespece for toolz such that all functions are curried
Currying provides implicit partial evaluation of all functions
Example:
Get usually requires two arguments, an index and a collection
>>> from toolz.curried import get
>>> get(0, ('a', 'b'))
'a'
When we use it in higher order functions we often want to pass a partially
evaluated form
>>> data = [(1, 2), (11, 22), (111, 222)]
>>> list(map(lambda seq: get(0, seq), data))
[1, 11, 111]
The curried version allows simple expression of partial evaluation
>>> list(map(get(0), data))
[1, 11, 111]
See Also:
toolz.functoolz.curry
"""
import toolz
import toolz.curried_exceptions
from .functoolz import curry
import inspect
def _nargs(f):
try:
return len(inspect.getargspec(f).args)
except TypeError:
return None
def _should_curry(f):
do_curry = set((toolz.map, toolz.filter, toolz.sorted, toolz.reduce))
return (callable(f) and _nargs(f) and _nargs(f) > 1
or f in do_curry)
_d = dict((name, curry(f) if _should_curry(f) else f)
for name, f in toolz.__dict__.items()
if '__' not in name)
_exceptions = dict((name, curry(f) if callable(f) else f)
for name, f in toolz.curried_exceptions.__dict__.items()
if '__' not in name)
locals().update(toolz.merge(_d, _exceptions))