| from .util import subvals |
|
|
|
|
| def unary_to_nary(unary_operator): |
| @wraps(unary_operator) |
| def nary_operator(fun, argnum=0, *nary_op_args, **nary_op_kwargs): |
| assert type(argnum) in (int, tuple, list), argnum |
|
|
| @wrap_nary_f(fun, unary_operator, argnum) |
| def nary_f(*args, **kwargs): |
| @wraps(fun) |
| def unary_f(x): |
| if isinstance(argnum, int): |
| subargs = subvals(args, [(argnum, x)]) |
| else: |
| subargs = subvals(args, zip(argnum, x)) |
| return fun(*subargs, **kwargs) |
|
|
| if isinstance(argnum, int): |
| x = args[argnum] |
| else: |
| x = tuple(args[i] for i in argnum) |
| return unary_operator(unary_f, x, *nary_op_args, **nary_op_kwargs) |
|
|
| return nary_f |
|
|
| return nary_operator |
|
|
|
|
| def wraps(fun, namestr="{fun}", docstr="{doc}", **kwargs): |
| def _wraps(f): |
| try: |
| f.__name__ = namestr.format(fun=get_name(fun), **kwargs) |
| f.__doc__ = docstr.format(fun=get_name(fun), doc=get_doc(fun), **kwargs) |
| except BaseException: |
| pass |
| finally: |
| return f |
|
|
| return _wraps |
|
|
|
|
| def wrap_nary_f(fun, op, argnum): |
| namestr = "{op}_of_{fun}_wrt_argnum_{argnum}" |
| docstr = """\ |
| {op} of function {fun} with respect to argument number {argnum}. Takes the |
| same arguments as {fun} but returns the {op}. |
| """ |
| return wraps(fun, namestr, docstr, op=get_name(op), argnum=argnum) |
|
|
|
|
| get_name = lambda f: getattr(f, "__name__", "[unknown name]") |
| get_doc = lambda f: getattr(f, "__doc__", "") |
|
|