天天看點

Python的類型注解AnnotationPython函數類型注解的方式

Python函數類型注解的方式

因為當Python用于大型項目時候,沒有類型這個Python的特征的弱點就暴露出來,特别是項目中人員層次參差不齊,項目中就會産生各種bug。

雖然動态語言Python雖然無法解決沒有類型的這個問題,但是它也做了一些折中方案。

加help文檔(3.5以後)

def add(x, y) ->int: # 函數注釋,非強制類型要求
    """
    :param x: int
    :param y: int
    :return: int
    """
    return x + y
help(add)
           
Help on function add in module __main__:

add(x:str, y:int) -> int
    :param x: int
    :param y: int
    :return: int
           

形參和傳回值注解(Python3.5以上)

這僅僅是用聲明,不是強制要求。Pycharm會根據這個指定類型做類型推斷。

def add(x:int, y) ->int: # 函數注釋,非強制類型要求
                            #x要求是int;add傳回值要求是int。
    return x + y
help(add)

           
Help on function add in module __main__:

add(x:int, y) -> int
           

辨別符注解(Python3.6以後)

Python按照參數注解做類型檢查

如果我們嘗試用annotation做判斷,可得到看似正确的結果,但問題是隻有在Python3.6下字典才有被記錄字典輸入順序。

不過,我們可以把這個需求作為一個練習:

def check(fn):
    def wrapper(*args, **kwargs):
        print(fn.__annotations__)
        list_anno_values = list(fn.__annotations__.values())
        print(list_anno_values)

        for index, para in enumerate(args):
            print(para, list_anno_values[index])  # 如果True說明送參類型正确
            print(isinstance(para, list_anno_values[index]))

        for k, v in kwargs.items():
            print(v, fn.__annotations__[str(k)]) # 如果True說明送參類型正确;False說明送參錯誤
            print(isinstance(v, fn.__annotations__[str(k)]))

            ret = fn(*args, **kwargs)
        return ret

    return wrapper


@check  # add = check(add) #add=>wrapper
def add(x: int, y: int) -> int:
    return x + y


add(4, y=5)
           
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
[<class 'int'>, <class 'int'>, <class 'int'>]
4 <class 'int'>
True
5 <class 'int'>
True





9