wrappers.py 715 字节
Newer Older
1 2
from functools import wraps

3
from treevalue import TreeValue, flatten_values
4

5
__all__ = [
HansBug's avatar
HansBug 已提交
6
    'ireduce',
7
    'return_self',
8 9
]

10

11 12
def ireduce(rfunc, piter=None):
    piter = piter or (lambda x: x)
13 14 15 16

    def _decorator(func):
        @wraps(func)
        def _new_func(*args, **kwargs):
HansBug's avatar
HansBug 已提交
17 18
            result = func(*args, **kwargs)
            if isinstance(result, TreeValue):
19
                it = flatten_values(result)
HansBug's avatar
HansBug 已提交
20
                return rfunc(piter(it))
21
            else:
HansBug's avatar
HansBug 已提交
22
                return result
23 24 25 26

        return _new_func

    return _decorator
27 28 29 30 31 32 33 34 35


def return_self(func):
    @wraps(func)
    def _new_func(self, *args, **kwargs):
        func(self, *args, **kwargs)
        return self

    return _new_func