Decorator修改python中函数打印的输出

时间:2018-06-09 10:12:52

标签: python

假设我有一个打印五行文字的功能。我想为它在控制台上打印的每一行添加像'asdf'和后缀'qwerty'这样的前缀。如何在python中使用decorator完成此操作。生成的输出可以来自我们想要装饰的函数中的记录模块或打印语句。

2 个答案:

答案 0 :(得分:1)

def my_decorator(func):
    def wrapping_func(strlist):
        for index, i in enumerate(strlist):
            strlist[index] = 'wubalubadubdub' + i
        return func(strlist)
    return wrapping_func

@my_decorator
def fun(str_list):
    for i in str_list:
        print(i)

if __name__ == "__main__":
    fun(['a', 'b'])

重复问题但是无论如何上面的代码都是你要找的,wrapping_func只是修改了给函数的参数,即添加一个前缀并在调用带有修改后的参数的原始函数时返回my_decorator函数只返回wrapping_func

答案 1 :(得分:1)

以下是演示此问题的示例代码。 Print语句输出是自定义的,但不是来自日志记录模块的语句。

from contextlib import contextmanager
@contextmanager
def no_stdout():
    import sys
    old_stdout = sys.stdout
    class CustomPrint():
        def __init__(self, stdout):
            self.old_stdout = stdout

        def write(self, text):
            if len(text.rstrip()):
                self.old_stdout.write('custom Print--->'+ text)

    sys.stdout = CustomPrint(old_stdout)

    try:
        yield
    finally:
        sys.stdout = old_stdout

def fun():
    import logging
    logger = logging.getLogger("tester")
    logger.info("Test line from function")

print "BEFORE"
with no_stdout():
    print "WHY HELLO!\n"
    print "DING DONG!\n"
    import logging
    logger = logging.getLogger("test")
    logger.info(" Hello world")
    fun()
print "AFTER"

输出:

BEFORE
custom Print--->WHY HELLO!
custom Print--->DING DONG!
2018-06-11 15:52:30,088 (42092) test INFO -  Hello world
2018-06-11 15:52:30,092 (42092) tester INFO - Test line from function
AFTER

我们发现日志模块输出不是自定义的。