Python的類型註解Annotation

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以後)

a:int = 1

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章