利用Decorator進行參數型別檢查

吳修福Hugh Wu

  • 恆逸教育訓練中心-資深講師
  • 技術分類:程式設計

 

 

Python程式語言近來受到許多人的關注,尤其在人工智慧與數據分析等領域。不過當要自己進行某些稍複雜的應用時,只用Python這個程式語言就會衍生出一些問題出來。

Pyhton是弱型別的語言,當在設計函數時如果有參數需要被傳入且此參數需為特定型別時,必須在接受到參數時由開發者自行進行檢查:

    def myfunc(arg):
        '''
        假設 arg 須為 int 型別
        '''
        if not isinstance(arg, int):
             raise TypeError("......") 

這種方式對於不同的函數參數列不同時需要一個一個單獨去進行處理,這樣會造成開發者的負擔。

在Python 3.6之後有annotations可以用來註記參數型別:

    def myfunc(arg:int):
        '''
        註記 arg 須為 int 型別
        '''

    # 取得註記
    print(myfunc.__annotations__)
    # 輸出 {'arg': }

如果只是單純註記,其實傳進去的參數型別是不會受到這個註記的限制的。

但是我們可以利用這個機制來寫一個檢查參數用的Decorator以便函數可以使用,以下是一個簡單的範例:

    def argcheck(func):

        def helper(*args):

            argtype = tuple(func.__annotations__.values())

            for i, v in enumerate(args):
                  if not isinstance(v, argtype[i]):
                       raise TypeError('worng type')

            return func(*args)
        

        return helper

假設我們有一個函數並套用上述的Decorator如下:

    @argcheck
    def myfunc(arg:str):

        print('Hello', arg)

接下來執行時就會進行參數型別檢查囉:

    myfunc('Python')
    # 輸出 Hello Python

    myfunc(123)
    # 得到 TypeError
    # Traceback (most recent call last):
    # 略...
    # TypeError: worng type

相關學習資源