python在3.5後引入了引數型別註解,例:
def
add(x:
int,y:
int)
->
int:
#對x,y和返回值都進行注釋,為int型別
return x + y
注:註解是對函式引數和返回值的『注釋』,沒有強制定義的作用(因為python是動態語言啊)
那麼既然註解不能強制定義型別,在函式呼叫中怎麼判斷傳入的引數是否是我想要的呢?
在次引入python的inspect模組
inspect模組主要提供了兩種用處:
對是否是模組,框架,函式等進行型別檢查
獲取類或函式的引數的資訊
import inspect
defadd
(x:int
,y=5
:int)-
>
int:
return x + y
#1、型別檢查
inspect.isfunction(add)
#判斷add是否是函式
inspect.ismethod(add)
#判斷add是否是類的方法
inspect.isgenerator(add)
#判斷add是否是生成器物件
inspect.isclass(add)
#判斷add是否是類..
.#還有很多is函式,詳情請查閱inspect模組幫助
#2、獲取引數資訊
sig=inspect.signature(add)
#獲得函式的簽名
>>
int, y:
int=5)
->
int>
params=sig.parameters #獲取函式的引數資訊
)
parameters 是inspect下的乙個類,可以把它看做是乙個有序字典,裡面存放了函式的引數和引數型別,可以取parameters.keys()和parameters.values(),其中遍歷parameters.values()的annotation屬性會得到引數的註解型別:
values=
list
(parameters.values())
#把結果放到list中方便遍歷
for i in values:
print
(values[i]
.annotation)
#逐一列印引數的註解型別,
>>
int>>
int
下面實現乙個函式的引數型別檢查的裝飾器函式:
import inspect
defcheck
(fn)
:def
(*args,
**kwargs)
: sig=inspect.signature(fn)
params=sig.parameters
values=
list
(params.values())
for i,p in
enumerate
(args):if
notisinstance
(p,values[i]
.annotation)
:#判斷傳入引數的型別和引數註解型別是否相等
print
('typewrong'
)for k,v in kwargs.items():
ifnot
isinstance
(v,params[k]
.annotation)
:print
('typewrong'
)return fn(
*args,
**kwargs)
@check
defadd
(x:int
,y=5
:int)-
>
int:
return x + y
python 函式引數型別檢查
在python中,不知道函式引數型別是乙個很正常的事情,特別是在乙個大專案裡。我見過有些專案裡,每乙個函式體的前十幾行都在檢查引數型別,這實在是太麻煩了。而且一旦引數有改動,這部分也需要改動。下面我們用裝飾器來實現,函式引數的強制型別檢查。首先,這個裝飾器,要接受型別引數,和指定函式引數的型別引數。...
python引數型別檢查 Python中的型別檢查
本文中所有 均執行在python 2.7上 為什麼要進行型別檢查?總所周知,python是一門典型的動態語言,在變數定義 使用的過程中遵循duck typing,當對某一變數進行操作時才去檢查它是否支援該操作。這在大多數情況下沒有什麼問題。但有時我們希望當面對非法型別的引數的時候採取某些預設處理機制...
Python函式引數型別
函式的引數 定義函式 引數 普通引數,預設引數,可變引數 可變位置引數,可變關鍵字引數 keyword only 引數 呼叫函式 傳參 位置引數,關鍵字引數,引數結構 位置引數解構,關鍵字引數解構 普通引數 x,y def add x,y return x y 預設引數 x 1 def inc ba...