1. 程式人生 > >python_如何定義帶參數的裝飾器?

python_如何定義帶參數的裝飾器?

class () 調用函數 案例 == nbsp item 字典 family

案例:

實現一個裝飾器,用它來檢查被裝飾函數的參數類型。

需求:

    裝飾器可以通過函數,指明函數參數類型,進行函數調用的時候,傳入參數,檢測到不匹配時,拋出異常

如何解決這個問題?

  1. 先要獲取函數的簽名,並且獲得裝飾器中參數,然後把函數簽名和裝飾器中參數對應綁定
  2. 把調用函數時候傳入的參數和函數簽名進行綁定
  3. 把實參和裝飾器中定義的數據進行類型比較,不匹配拋出異常
    #!/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_types)
            
            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:
                        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_如何定義帶參數的裝飾器?