函式動態型別檢查的裝飾器代碼
import inspect
import functools
def typeHints(fn):
@functools.wraps(fn)
def wrap(*args, **kwargs):
sig = inspect.signature(fn)
params = sig.parameters
# 處理kwargs:字典
for k, v in kwargs:
param = params[k]
if param.annotation != inspect._empty and not isinstance(v, param.annotation):
raise TypeError('parameter {} requires {}, but got {}'.format(k, param.annotation, type(v)))
# 處理args:元組
for i, x in enumerate(args):
param = list(params.values())[i]
if param.annotation != inspect._empty and not isinstance(x, param.annotation):
raise TypeError('parameter {} requires {}, but got {}'.format(param.name, param.annotation, type(x)))
ret = fn(*args, **kwargs)
return ret
return wrap
@typeHints
def add(x: int, y: int) -> int:
return x + y
@typeHints
def add1(x, y:int) -> int:
return x + y
print(add(3, 5)) # 輸出結果為8
print(add1(1, 2)) # 輸出結果為3
型別檢查主要使用了inspect庫,本次代碼運行環境是python3.5.2,inspect庫的使用方法在下面介紹,
inspect模塊
檢查函式動態型別時,我們主要使用的是inspect庫中的signature類,parameter類,可以使用help方法查看inspect的詳細資訊:
import inspect
help(inspect)
inspect庫的源代碼見:/home/clg/.pyenv/versions/3.5.2/lib/python3.5/inspect.py
這個庫用來獲取Python動態物件的有用資訊,比如本次用到的注解,
Signature類
Signature是inspect模塊的一個類,inspect模塊的signature函式用來獲取一個Signature物件,函式原型如下:
signature() - get a Signature object for the callable
Signature類有一個屬性是OrderedDict型別的parameters,存盤的是引數名稱到引數物件(Parameter類的物件)的一個有序映射,
Parameter類
Parameter類的物件主要用來組成signature()回傳的Signature物件的parameters屬性,Parameter類有兩個常用的屬性:
- name :str 引數的名稱
- annotation 引數的注解,如果沒有注解,則annotation為
Parameter.empty
inspect模塊示例
def add(x: int, y: int) -> int:
return x + y
import inspect
sig = inspect.signature(add)
print(sig.parameters)
print(sig.parameters['x'])
print(sig.parameters.values())
# 輸出結果
OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">)])
x:int
odict_values([<Parameter "x:int">, <Parameter "y:int">])
odict_values類似于list,但是不支持下表操作,因此需要用list()轉化為list之后再做下表操作,
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什么?快去關注下載吧!!!

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145382.html
標籤:Python
