Python裝飾器實現函式動態型別檢查

2022-04-28 15:57:07 字數 2474 閱讀 9097

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庫中的signature類,parameter類。可以使用help方法檢視inspect的詳細資訊:

import inspect

help(inspect)

inspect庫的源**見:/home/clg/.pyenv/versions/3.5.2/lib/python3.5/inspect.py這個庫用來獲取python動態物件的有用資訊,比如本次用到的註解。

signature是inspect模組的乙個類,inspect模組的signature函式用來獲取乙個signature物件,函式原型如下:

signature() - get a signature object for the callable

signature類有乙個屬性是ordereddict型別的parameters,儲存的是引數名稱到引數物件(parameter類的物件)的乙個有序對映。

parameter類的物件主要用來組成signature()返回的signature物件的parameters屬性。parameter類有兩個常用的屬性:

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', ), ('y', )])

x:int

odict_values([, ])

odict_values類似於list,但是不支援下表操作,因此需要用list()轉化為list之後再做下表操作。

記得幫我點讚哦!

念念不忘,必有迴響,小夥伴們幫我點個贊吧,非常感謝。

我是職場亮哥,yy高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。

聽我說,進步多,程式人生一把梭

python裝飾器實現函式註冊和類裝飾器

01 一般情況下都是使用函式作為裝飾器,其實class也是可以的,function是callable物件,class只有重寫了 call 方法後,它的例項物件也就是callable物件了。02 裝飾器的巢狀 就乙個規律 巢狀的順序和 的順序是相反的。class functionmanager def...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...