說說 Python 裝飾器 引數 的那些事兒。

2021-09-25 00:19:09 字數 1405 閱讀 7048

我介紹了學習 python 裝飾器的必備知識以及其最最基本的概念。既然是基本的知識點,那就是還有不基本,因為當時的考慮是篇幅已經夠長以及裡面涉及的知識點已經很多,寫的再多了勢必會影響大家的理解。所以剩下的那些留到今天來寫,如果你沒有看過之前的那篇文章,建議看過了再回來呦。

00.獲取函式引數

接下來我們來使用一下上述定義的 stack 類,在用的過程中我發現了一件很奇怪的事,當我向下面這樣呼叫的時候程式是正常的:

而當我像下面這樣呼叫的時候,程式就會報錯:

你可能會生成「這怎麼會出錯」的疑問,因為按照我們理解的,「關鍵字引數」會根據名字進行匹配,而「位置引數」會根據引數所在的順序進行匹配,既然這樣的話,admin 明明是穿進了 username 變數,那為啥會出錯呢?

其實上面我們懷疑的原因都沒有問題,有問題的是我們的裝飾器寫的有問題。問題就是出現在裝飾器的引數傳遞上

在 check_admin 這個裝飾器中,我直接從 kwargs.get 中獲得了 username 這個值。第乙個正確是因為我用的是關鍵字引數傳遞的 username,那麼 username 的變數以及值理應在 kwargs 中,第二個錯誤是因為我們用位置引數傳遞的 username,那麼 username 的值出現在 args 中。

那麼新的問題來了,作為使用者來講,無論使用位置引數或者是關鍵字引數都是對的,這個我們是無法去控制的,那這個問題應該怎麼解決呢?python 說:「用inspect 模組」。其中的 getcallargs 可以解決這個問題,它返回的是乙個字典,這個字典裡儲存了函式的所有引數。加下來我們看該怎麼改:

01.帶引數的裝飾器

在我們之前熟知的裝飾器語法中,外層函式的引數是被裝飾的函式,內層函式的引數是被裝飾的函式的引數。但是有些時候我們想針對不同的函式裝飾器有些變化怎麼辦,即給裝飾器後面帶上相應的引數。

比如有個針對加和減的裝飾器如下所示:

但這個時候我想做點改變,想把函式的名字也給打出來,這個時候我們裝飾器肯定就是要帶上引數了,引數傳的就是函式的名字,這個時候我們該怎麼辦?其實也簡單的很,那就再巢狀一層函式唄。具體如下所示:

其實這麼來看,裝飾器寫起來還是套路滿滿呢。

今天就到這裡就結束啦,不知道你學會了沒呢?

Python 裝飾器,帶有引數的裝飾器

demo.py 裝飾器,帶引數的裝飾器 def set level level num def set func func def call func args,kwargs if level num 1 print 許可權級別1,驗證 elif level num 2 print 許可權級別2,驗...

python 通用裝飾器,帶有引數的裝飾器,

使用裝飾器對有返回值的函式進行裝飾 def func functionname print func 1 def func in print func in 1 x functionname 儲存返回來的hahah print func in 2 return x print func 2 retu...

python的引數裝飾器類

1 在python中有裝飾器函式 def innner args,kwargs 需要裝飾的 result func 需要裝飾的 return result return innner my adorn def fun pass2 另外還引數裝飾器函式,也叫工廠裝飾器函式,用於解決裝飾器函式無法傳入其...