mohand.decorator 源代码

# encoding=utf8
"""
此模块提供随包附带的基础 ``hand`` ,用以实现最基础功能,即将 ``handfile``
中的目标方法装饰为一个 ``mohand`` 子命令的 ``general`` 装饰器,更多扩展
``hand`` 您可以通过安装扩展包来获得
"""
import logging

from mohand.hands import hand

log = logging.getLogger(__name__)


def _register(func):
    """
    将被装饰函数注册到 hand 单例字典中

    :param object func: 被装饰函数
    :return: 被装饰的函数本身(不进行封装)
    :rtype: function
    """
    hand[func.__name__] = func
    return func


[文档]@_register def general(*dargs, **dkwargs): """ 将被装饰函数封装为一个 :class:`click.core.Command` 类, 此装饰器并不提供额外的复杂功能,仅提供将被装饰方法注册为一个 ``mohand`` 子命令的功能 该装饰器作为一个一般装饰器使用(如: ``@hand.general`` ) .. note:: 该装饰器会在插件系统加载外部插件前辈注册到 :data:`.hands.hand` 中。 此处的 ``general`` 装饰器同时兼容有参和无参调用方式 :param int log_level: 当前子命令的日志输出等级,默认为: ``logging.INFO`` :return: 被封装后的函数 :rtype: function """ invoked = bool(len(dargs) == 1 and not dkwargs and callable(dargs[0])) if invoked: func = dargs[0] def wrapper(func): @hand._click.command( name=func.__name__.lower(), help=func.__doc__) def _wrapper(*args, **kwargs): log_level = dkwargs.pop('log_level', logging.INFO) log.setLevel(log_level) log.debug("decrator param: {} {}".format(dargs, dkwargs)) log.debug("function param: {} {}".format(args, kwargs)) func(*args, **kwargs) return _wrapper return wrapper if not invoked else wrapper(func)