module.py 1.4 KB
Newer Older
1
import inspect
2 3 4
from functools import wraps
from typing import Type

HansBug's avatar
HansBug 已提交
5
from hbutils.reflection import post_process
6 7 8 9 10 11
from treevalue import TreeValue
from treevalue import func_treelize as original_func_treelize

from .trees import auto_tree
from .wrappers import return_self
from ..utils import doc_from_base as original_doc_from_base
12
from ..utils import replaceable_partial
13 14 15 16 17 18

__all__ = [
    'module_func_loader',
]


19
def module_func_loader(base, cls: Type[TreeValue], cls_mapper=None):
20
    func_treelize = replaceable_partial(original_func_treelize, return_type=cls)
21
    doc_from_base = replaceable_partial(original_doc_from_base, base=base)
22 23 24
    outer_frame = inspect.currentframe().f_back
    outer_module = outer_frame.f_globals.get('__name__', None)
    auto_tree_cls = replaceable_partial(auto_tree, cls=cls_mapper or cls)
25 26 27 28 29 30 31 32

    def _load_func(name):
        func = getattr(base, name)
        return_self_dec = return_self if func.__name__.endswith("_") else (lambda x: x)

        @doc_from_base()
        @return_self_dec
        @post_process(auto_tree_cls)
33
        @func_treelize(return_type=TreeValue, subside=True, rise=True)
34 35 36 37 38
        @wraps(func, assigned=('__name__',), updated=())
        def _new_func(*args, **kwargs):
            return func(*args, **kwargs)

        _new_func.__qualname__ = _new_func.__name__
39
        _new_func.__module__ = outer_module
40 41 42
        return _new_func

    return _load_func