2016-02-17 58 views
0

我正在嘗試學習如何製作我自己的裝飾器。我不明白如何「調用」正在封裝的函數內部的數據。如何製作一個檢查變量是否存在的裝飾器?

我想做一個非常簡單的裝飾器,將msg的值寫入文本文件。

def logging(f): 
    def decorator(args, **kwargs):  
     debug_file = "/tmp/easylog.txt" 
     fh = open(debug_file, 'a') 
     fh.write(f.message + "\n") 
     fh.close() 
    return decorator 

@logging 
def test(a,b): 
    c=a+b 
    message = "hello test" 
    return c 


test(4,5) 

所以我不明白該怎麼做的部分是檢查裝飾器內的消息。

在我讀過的所有基本教程中,它展示瞭如何獲取整個返回值並以粗體顯示或者其他內容,我正在嘗試學習如何獲取各個值並操作它們。

+0

另外,我知道Python已經內置了日誌記錄機制,但爲了學習,我想弄清楚這個例子。 – david

回答

2

根據您的代碼示例,您的裝飾器代碼無法訪問消息的值。請記住,裝飾器是對函數調用的包裝。在您的代碼消息內定義了測試()函數的作用域。

你可以有一個全局變量名爲message ...聲明爲global在你的函數內......但是這非常混亂,通常被認爲是糟糕的設計。

您可以重構此代碼,以便test()是一些類的方法;和消息是一個實例歸因(或類屬性,如果您想對該類的所有實例有點類似「全局」)。然後它將被稱爲self.message(通常使用self)。

你也可以改變試驗(+)返回一個元組((消息,C)),然後修改您的裝飾,以提取消息並返回休息:msg, result = f(*args, **kwargs)在您使用味精爲您消息並返回結果

請記住,裝飾器是包裝,你可以鑽入你調用的函數的範圍。

相關問題