2017-02-28 101 views
1

我想在python中编写一个装饰器:如果一个被调用的函数包含print's,装饰器会在调用该函数之前打印她的名字。我熟悉装饰器的语法,但是我在检查一个函数是否有print的问题。检查一个函数在Python中使用打印函数

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

找出如果一个函数调用另一个函数为[硬盘](https://stackoverflow.com/questions/12013399/in-python-determine-if-a - 功能 - 通话,另一个功能)。我可以建议你使用['logging'](https://docs.python.org/3/library/logging.html)模块吗?然后,您可以在创建格式化程序时轻松使用诸如'%(funcName)s'之类的东西。 – Josh

+0

@Josh,谢谢,我会看看这个功能 – Macaronnos

+0

这可以通过覆盖sys.stdout来完成 –

回答

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

我这种情况下,你可以重新打印

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() 
+0

这个装饰器根本就没有做任何事情。仅仅因为您在当前范围内重新定义了打印件并不意味着装饰功能也会使用新打印件。 –

+0

@在计算机上编译我的代码。我使用python 3.4 – sahama

+0

这不检查函数是否调用'print'。 –