def log(func):
    """
    打印函数运行日志的装饰器
    :param func:
    :return:
    """

    # wraps 这个装饰器会将 func 的 doc 和 __name__ 复制过来
    # 否则在 wrapper 中调用 func.__name__ 输出的就是 wrapper
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('before call %s' % func.__name__)
        ret = func(*args, **kwargs)
        print('after call %s' % func.__name__)
        return ret

    return wrapper