2015-06-16 163 views
0

我想了解更多關於Python裝飾器的知識,使用優秀教程https://realpython.com/blog/python/primer-on-python-decorators/python裝飾器問題

我試圖偏離腳本,並遇到一些問題。代碼如下。基本上,當我運行下面的腳本時,第一個函數調用 time_print_function()按預期執行。

但我得到在接下來的函數調用my_decorator錯誤(打印(datetime.datetime.now()))()

我預計這將產生輸出相同time_print_function()

代碼是

def my_decorator(some_function): 
    def wrapper(*args): 
     print "Something is happening before some_function() is called." 


    if args: 
    some_function(args) 
    else: 
    some_function() 
    print "Something is happening after some_function() is called." 


return wrapper 

@my_decorator 
def time_print_function(): 
    print(datetime.datetime.now()) 
time_print_function() 
my_decorator(print(datetime.datetime.now()))() 

回答

3

的問題是,此表達式:

my_decorator(print(datetime.datetime.now()))() 

在將其作爲參數傳遞給 調用my_decorator之前已經調用打印功能。 my_decorator收到print的返回值 ,它是None並嘗試調用它,產生錯誤 (None顯然不可調用)。

到裝飾的參數應該是一個功能 - 你可以 創建使用lambda一個內聯,例如:

my_decorator(lambda: print(datetime.datetime.now()))() 
+0

感謝。仍然看到一個錯誤。在使用lambda之前,我需要導入一些東西嗎?我試過進口操作系統。文件 「decorator_examples.py」 53行 my_decorator(拉姆達:打印(datetime.datetime.now()))() ^ 語法錯誤:無效的語法 [在0.1秒完成,退出代碼1] –

+0

不適用於拉姆達,但是對於使用「print」作爲函數,您必須使用Python3.x或在Python 2.x中使用'from __future__ import print_function'。 – jsbueno

+0

謝謝。這樣可行。 –