Source code for extepy._fun
from functools import wraps
[docs]
def pack(f):
"""Merge all positional arguments of a function to a single tuple argument
Parameters:
f (callable):
Returns:
callable:
Examples:
Apply on a function.
>>> packed = pack(isinstance)
>>> packed([1.0, float])
True
Use as a decorator.
>>> import math
>>> @pack
... def g(*args):
... return sum(arg + 1 for arg in args)
>>> g([1, 2, 3])
9
"""
def fun(args, **kwargs):
result = f(*args, **kwargs)
return result
return fun
[docs]
def unpack(f):
"""Replace a single tuple/list argument to many positional arguments.
Parameters:
f (callable):
Returns:
callable:
Examples:
Apply on a function.
>>> unpacked = unpack(all)
>>> unpacked(True, True, True)
True
Use as decorator.
>>> @unpack
... def g(values):
... return max(values) - min(values)
>>> g(1, 2, 3)
2
"""
def fun(*args, **kwargs):
result = f(args, **kwargs)
return result
return fun
[docs]
def skewer(*callables):
"""Composite multiple callables into one callable.
Parameters:
*callables (callable):
Returns:
callable: A callable that calls all callables in order.
Examples:
>>> def minmax(x, y):
... return min(x, y), max(x, y)
>>> def mul(x, y):
... return x * y
>>> skewered = skewer(minmax, mul)
>>> skewered(5, 3)
15
"""
def fun(*args, **kwargs):
result = args
for callable in callables:
if isinstance(result, tuple):
result = callable(*result, **kwargs)
else:
result = callable(result, **kwargs)
return result
return fun
[docs]
def repeat(n=1):
"""Repeat a callable n times.
Parameters:
n (int): Number of times to repeat.
Returns:
Callable[callable, callable]: a callable that swaps a callable so that it is called n times.
Examples:
Apply on a function.
>>> repeated = repeat(n=2)(abs)
>>> repeated(-3)
3
Use as a decorator.
>>> @repeat(n=2)
... def g(a):
... return a + 1
>>> g(1)
3
"""
def wrapper(f):
callables = [f] * n
@wraps(f)
def fun(*args, **kwargs):
skewed = skewer(*callables)
result = skewed(*args, **kwargs)
return result
return fun
return wrapper
[docs]
def call(f, *args, **kwargs):
"""Call a callable with positional arguments and keyword arguments.
Parameters:
f: Callable object.
*args: Positional arguments.
**kwargs: Keyword arguments.
Returns:
Result of the callable.
Examples:
>>> call(sum, [2, 3, 6])
11
"""
return f(*args, **kwargs)