我想在python
中写一个装饰器:如果被调用的函数包含print
,装饰器会在调用此函数之前打印她的名字。我熟悉装饰器语法,但是我在检查函数本身是否有print
时遇到问题。
def preceeding_name(func):
@wraps(func)
def wrapper(*args, **kwargs):
if 'print' in func:
print(func.__name__)
result = func(*args, **kwargs)
return result
return wrapper
没有必要检查函数中的print
是否实际被调用。
答案 0 :(得分:3)
这可以通过暂停“打印”缓冲区并检查它以查看是否已完成打印来完成。
class Out(object):
def write(self,s):
self.s += s
def __init__(self)
self.s = ''
现在检查
def wrapper(*args, **kwargs):
our_out = Out()
sys.stdout = our_out
result = func(*args, **kwargs)
if len(our_out.s)>0:
sys.stdout = sys.__stdout__
print func.__name__
for s in our_out.s.split('\n'):
print s
return result
答案 1 :(得分:-1)
我在这种情况下可以重新定义打印
def preceeding_name(func):
@wraps(func)
def wrapper(*args, **kwargs):
old_print = print
def print(*arg, **kwarg):
old_print(func.__name__)
old_print(*arg, **kwarg)
result = func(*args, **kwargs)
return result
return wrapper
编辑: 我测试和这项工作
old_print = print
def preceeding_name(func):
def print(*arg, **kwarg):
old_print(func.__name__, end='')
old_print(*arg, **kwarg)
def wrapper(*args, **kwargs):
print('')
result = func(*args, **kwargs)
return result
return wrapper
@preceeding_name
def a():
print('hi')
a()
@preceeding_name
def b():
print('hi')
b()
EDIT2:
old_print = print
def preceeding_name(func):
global print
def print(*arg, **kwarg):
old_print(func.__name__)
old_print(*arg, **kwarg)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result
return wrapper
@preceeding_name
def a():
print('hi')
a()
@preceeding_name
def b():
# print('hi')
pass
b()