python如何定義帶引數的裝飾器

2022-10-04 20:21:24 字數 1315 閱讀 6093

案例:

實現乙個裝飾器,用它來檢查被裝飾函式的引數型別。

需求:裝飾器可以通過程式設計客棧函式,指明函式引數型別,進行函式呼叫的時候,傳入引數,檢測到不匹配時,丟擲異常

如何解決這個問題?

先要獲取函式的簽名,並且獲得裝飾器中引數,然後把函式簽名和裝飾器中引數對應繫結

把呼叫函式時候傳入的引數和函式簽名進行繫結

把實參和裝飾器中定義的資料進行型別比較,不匹配丟擲異常

#!/usr/bin/python3

from inspect import signature

def check_type(*ty_args, **ty_kwargs):

def out_wrapper(func):

# 通過signature方法,獲取函式形參:name, age, height

sig = signature(func)

# 獲得裝飾器傳來的引數, 函式簽名與之繫結,字典型別

bind_types = sig.bind_partial(*ty_args, **ty_kwargs).arguments

print(bind_t程式設計客棧ypes)

程式設計客棧

def wrapper(*args, **kwargs):

# 給執行函式中具體的實參進行和形參進行繫結,形成字典的形式

func_type = sig.bind(*args, **kwargs).arguments.items()

print(func_type)

# 迴圈形參和實參字典的items()形式

for name, obj in func_type:

if name in bind_types:

mg**jrbmpv 程式設計客棧 if not isinstance(obj, bind_types[name]):

raise typeerror('%s must be %s' % (name, bind_types[name]))

func(*args, **kwargs)

return wrapper

return out_wrapper

# 通過裝飾器實現對函式引數進行型別檢查

@check_type(str, int, float)

def func(name, age, height):

print(name, age, height)

if __name__ == '__main__':

func('bei_men', 18, 1.75)

本文標題: python如何定義帶引數的裝飾器

本文位址:

Python 如何定義帶引數的裝飾器?

案例 實現乙個裝飾器,用它來檢查被裝飾函式的引數型別。需求 裝飾器可以通過函式,指明函式引數型別,進行函式呼叫的時候,傳入引數,檢測到不匹配時,丟擲異常 如何解決這個問題?先要獲取函式的簽名,並且獲得裝飾器中引數,然後把函式簽名和裝飾器中引數對應繫結 把呼叫函式時候傳入的引數和函式簽名進行繫結 把實...

如何定義帶引數裝飾器?

需求 實現乙個裝飾器,它用來檢查被裝飾函式的引數型別,裝飾器可以通過引數來指明函式引數型別,呼叫時如果檢測出引數不匹配則丟擲異常 type assert str,int,int def f a,b,c type assert y list def g x,y 思路 1 提取函式簽名,inspect....

帶引數的巨集定義

不是進行簡單的字串替換,還要進行引數替換。其定義的一般形式為 define 巨集名 參數列 字串 字串中包含在括弧中所指定的引數。如 define s a,b a b area s 3,2 定義矩形面積s,a 和 b 是邊長。在程式中用了s 3,2 把3 2分別代替巨集定義中的形式引數a b,即用 ...