Python 在函數(shù)上添加包裝器
問題
你想在函數(shù)上添加一個包裝器,增加額外的操作處理(比如日志、計時等)。
解決方案
如果你想使用額外的代碼包裝一個函數(shù),可以定義一個裝飾器函數(shù),例如:
import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the execution time.
'''
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end-start)
return result
return wrapper
下面是使用裝飾器的例子:
>>> @timethis ... def countdown(n): ... ''' ... Counts down ... ''' ... while n > 0: ... n -= 1 ... >>> countdown(100000) countdown 0.008917808532714844 >>> countdown(10000000) countdown 0.87188299392912 >>>
討論
一個裝飾器就是一個函數(shù),它接受一個函數(shù)作為參數(shù)并返回一個新的函數(shù)。當你像下面這樣寫:
@timethis def countdown(n): pass
跟像下面這樣寫其實效果是一樣的:
def countdown(n): pass countdown = timethis(countdown)
順便說一下,內(nèi)置的裝飾器比如 @staticmethod, @classmethod,@property 原理也是一樣的。例如,下面這兩個代碼片段是等價的:
class A:
@classmethod
def method(cls):
pass
class B:
# Equivalent definition of a class method
def method(cls):
pass
method = classmethod(method)
在上面的 wrapper() 函數(shù)中,裝飾器內(nèi)部定義了一個使用 *args 和 **kwargs 來接受任意參數(shù)的函數(shù)。在這個函數(shù)里面調(diào)用了原始函數(shù)并將其結(jié)果返回,不過你還可以添加其他額外的代碼(比如計時)。然后這個新的函數(shù)包裝器被作為結(jié)果返回來代替原始函數(shù)。
需要強調(diào)的是裝飾器并不會修改原始函數(shù)的參數(shù)簽名以及返回值。使用 *args 和 **kwargs 目的就是確保任何參數(shù)都能適用。而返回結(jié)果值基本都是調(diào)用原始函數(shù) func(*args, **kwargs) 的返回結(jié)果,其中func就是原始函數(shù)。
剛開始學習裝飾器的時候,會使用一些簡單的例子來說明,比如上面演示的這個。不過實際場景使用時,還是有一些細節(jié)問題要注意的。比如上面使用 @wraps(func) 注解是很重要的,它能保留原始函數(shù)的元數(shù)據(jù)(下一小節(jié)會講到),新手經(jīng)常會忽略這個細節(jié)。接下來的幾個小節(jié)我們會更加深入的講解裝飾器函數(shù)的細節(jié)問題,如果你想構(gòu)造你自己的裝飾器函數(shù),需要認真看一下。
以上就是Python 在函數(shù)上添加包裝器的詳細內(nèi)容,更多關于Python 添加包裝器的資料請關注腳本之家其它相關文章!
相關文章
Python技巧分享之如何將字符串轉(zhuǎn)回DataFrame格式
平常我們使用pandas,一般使用的是DataFrame和Series,但個別交換數(shù)據(jù)的時候,只能使用字符串,那如何再將字符串再轉(zhuǎn)回DataFrame格式呢,本文就來和大家講講解決辦法2023-06-06
python GUI庫圖形界面開發(fā)之PyQt5單選按鈕控件QRadioButton詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5單選按鈕控件QRadioButton詳細使用方法與實例,需要的朋友可以參考下2020-02-02
python 內(nèi)置庫wsgiref的使用(WSGI基礎入門)
WSGI(web服務器網(wǎng)關接口)主要規(guī)定了服務器端和應用程序之間的接口,即規(guī)定了請求的URL到后臺處理函數(shù)之間的映射該如何實現(xiàn)。wsgiref是一個幫助開發(fā)者開發(fā)測試的Python內(nèi)置庫,程序員可以通過這個庫了解WSGI的基本運行原理,但是不能把它用在生產(chǎn)環(huán)境上。2021-06-06

