11/4/2019 - 8:37 AM

在装饰器中使用doctest需要加上 @functools.wraps

import doctest


import functools

# 如果不加上@functools.wraps(func)这一行的话, foo函数里面的doc测试就会失败。
# 原因是foo这个symbol实际上绑定的是wrapper这个函数,
# 运行的其实是wrapper.__doc__里面的测试里,自然就失败了。


def log(func):
    # @functools.wraps(func)
    def wrapper(*args, **kwargs):
        """
        >>> foo()
        'warpper'
        """
        return func(*args, **kwargs)

    return wrapper


@log
def foo():
    """
    >>> foo()
    'foo'
    """
    return "foo"


if __name__ == "__main__":
    print(foo.__doc__)
    doctest.testmod(verbose=False)