1.1裝飾器的應用:引數型別檢查
函式引數的檢查,一定是在函式外函式應該作為引數,傳入到檢查函式中
檢查函式拿到函式傳入的實際引數,與形參宣告對比
__annotations__屬性是乙個字典,其中包括返回值型別的宣告。假設要做位置引數的判斷,無法和字典中的宣告對應。使用inspect模組
inspect模組:提供獲取物件資訊的函式,可以檢查函式和類、型別檢查
from functools importwraps
import
inspect
defcheck(fn):
@wraps(fn)
def _check(*args,**kwargs):
sig =inspect.signature(fn)
params = sig.parameters #
傳入的引數是有序的字典,標識的是函式的簽名
keys = list(params.keys()) #
把形參的引數從字典中提取出來,利用list函式迭代出來,在利用索引取值
values = list(params.values())#
把形參的引數註解的型別拿到,用list函式迭代,在利用索引取值
for k,v in enumerate(args): #
args實參迭代,k可以利用在索引取值上
print('
k={},v={}
'.format(k,v))
if isinstance(v,values[k].annotation): #
拿到引數註解的型別 eg:int or str
print("=="
)
for key,val in
kwargs.items():
ifisinstance(val,params[key].annotation):
print("=="
) result = fn(*args,**kwargs)
return
result
return
_check
@check
def add(x,y:str)->str:
return x+y
add(x='
a',y='
b') #
print == 'ab'
Python 裝飾器例項
偶然看到一篇文章,想到了前幾天的乙個需求,git pull效能不穩,需要加入重試機制,正好這個裝飾器的例項符合這樣的場景。coding utf 8 import time import logging import socket from functools import wraps logging...
Python裝飾器(例項演練)
原理 裝飾器說到底就是閉包的多層運用,內部呼叫外層函式的區域性變數返回給外部函式再在全域性呼叫結果。原則 1.封閉開放原則。2.把寫的基礎函式 別人或者各個模組呼叫 封閉起來不做更改。3.需要增加功能時,可以拓展。語法 加上 符 系統會自動把下面的函式當成引數傳到裝飾器中,從下到上。功能舉例 假如我...
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...