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