您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹Python中如何設置與定義被裝飾函數參數,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
被裝飾函數參數的設置與定義
先來看一段代碼
import time def timmer(func): def inner(): start_time=time.time() func() end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name)
如上所示,home函數添加了一個參數,而index函數并沒有參數。按照正常的函數的定義與調用方式,調用index函數和home函數的方式應該是下面這種形式:
index() home("python")
然后我們運行程序就會發現,程序拋出了異常。
File "E:\python_learn\py_code\test.py", line 28, in <module> home("python") TypeError: inner() takes 0 positional arguments but 1 was given
說個異常說明inner函數不需要位置參數,但是我們給了一個位置參數。回到timmer裝飾器定義的部分,可以看到,timmer裝飾器的內部函數確實沒有定義參數。這樣一來,timmer裝飾器只能用于裝飾沒有參數的函數了,我們可以在timmer裝飾器定義的時候為inner函數添加一個參數。
import time def timmer(func): def inner(name): start_time=time.time() func(name) end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) index() home("python")
但是這樣一來,timmer裝飾器裝飾index函數的時候又會拋出異常,因為index函數沒有參數。
File "E:\python_learn\py_code\test.py", line 27, in <module> index() TypeError: inner() missing 1 required positional argument: 'name'
在不知道被裝飾函數的參數個數的情況下,即被裝飾函數的參數可變長,且形式不固定的時候,可以使用*args和**kwargs,把上面的代碼修改:
import time def timmer(func): def inner(*args,**kwargs): start_time=time.time() func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) index() home("python")
再次運行程序,查看運行結果:
welcome to index page run time: 2.0 welcome to python home page run time: 3.0
由上可知,在不知道被裝飾函數的參數個數時,可以使用*args和**kwargs來表示任意長度任意形式的參數。
被裝飾函數的返回值
修改上面的代碼,為home函數定義一個返回值,分別打印index函數和home函數的返回值。
import time def timmer(func): def inner(*args,**kwargs): start_time=time.time() func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) return("home func") index_res=index() print(index_res) home_res=home("python") print(home_res)
運行程序,可以看到:
welcome to index page run time: 2.0 None welcome to python home page run time: 3.0 None
可以看到,home函數中定義的返回值并沒有被打印出來,顯示的值為None。因為這里執行的home函數不是原始定義的home函數,而是wrapper函數的執行結果。因為wrapper函數并沒有定義返回值,所以執行被裝飾后的home函數并沒有打印出返回值。
修改代碼,在timmer裝飾器中定義并返回被裝飾函數執行的返回值。
import time def timmer(func): def inner(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return res return inner @timmer def index(): time.sleep(2) print("welcome to index page") @timmer def home(name): time.sleep(3) print("welcome to %s home page" % name) return("home func") index_res=index() print(index_res) home_res=home("python") print(home_res)
再次執行函數,查看執行結果:
welcome to index page run time: 2.0 None welcome to python home page run time: 3.0 home func
可以看來,原始home函數中定義的返回值被打印出來了。
結論:
(1)如果被裝飾函數沒有定義返回值,timmer裝飾器裝飾后的返回值為None。
(2)如果被裝飾函數定義了返回值,則timmer裝飾器裝飾后則返回被裝飾函數的返回值。
關于Python中如何設置與定義被裝飾函數參數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。