假设我有一个打印五行文字的功能。我想为它在控制台上打印的每一行添加像'asdf'和后缀'qwerty'这样的前缀。如何在python中使用decorator完成此操作。生成的输出可以来自我们想要装饰的函数中的记录模块或打印语句。
答案 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
我们发现日志模块输出不是自定义的。