2016-03-06 44 views
0

我正在編寫python API,我有一個問題。 我有3個不同的功能:3個不同功能的一個裝飾器

func1()  -> return only text 
func2(name) -> return text only but takes parameter 
func3(name) -> this function create a file "name".txt 

現在我有裝飾的一個問題,我想創建一個被稱爲每次功能的日誌裝飾被調用。 問題是我不知道如何簡單地做到這一點,我知道如何創建它沒有參數或一個參數,但我不知道熱的創建將適用於所有三個功能的通用裝飾器。

現在我有這樣的事情:

def log(func): 
    def wrapper(name): 
     func(name) 
     log = ('write something here') 
     f = open('log.txt', 'a+') 
     f.write(log + "\n") 
     f.close(name) 
    return wrapper 
+0

你需要使用任意參數 - 例如見http://stackoverflow.com/q/36901/3001761。然後只要'返回''func'返回的任何東西,不顯式返回任何東西的函數返回'None'。 – jonrsharpe

回答

2

你的包裝應該接受的參數任意數量,與*args**kwargs語法同時捕獲位置和關鍵字參數。確保返回無論包裝的函數返回:

def log(func): 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     log = ('write something here') 
     with open('log.txt', 'a+') as f: 
      f.write(log + "\n") 
     return result 
    return wrapper 

你可能想在@functools.wraps decorator增加;這份跨越任何文檔和其他元數據從原來的包裝功能,新包裝:

from functools import wraps 

def log(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     result = func(*args, **kwargs) 
     log = ('write something here') 
     with open('log.txt', 'a+') as f: 
      f.write(log + "\n") 
     return result 
    return wrapper 

最後但並非最不重要的,而不是重新打開日誌文件自己,看看在logging module處理日誌文件爲你。

+0

謝謝我會嘗試,看起來像我需要的答案。 ;) – eMZet

1
def log(func): 
    def wrapper(*args, **kwds): 
     log = func(*args, **kwds) 
     f = open('log.txt', 'a+') 
     f.write(log + "\n") 
     f.close() 
    return wrapper 

@log 
def func1(): 
    return "Called function 1" 

@log 
def func2(name): 
    return "Called function 2 with " + name 

@log 
def func3(name): 
    f = open('name.txt', 'a+') 
    f.write(name + " from func3\n") 
    f.close() 
    return "Called function 3 with " + name 

def main(): 
    func1() 
    func2("func2") 
    func3("func3") 

if __name__ == '__main__': 
    main() 

log.txt的變成:

Called function 1 
Called function 2 with func2 
Called function 3 with func3