2017-02-28 100 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'。 –