標籤:

python 3.5 中 PEP0484 新加入的 Type Hints 的使用方法是什麼?

從 Python 3.5 有什麼新特性? - Python @徐釀泉 的回答中得知,Python 3.5 中將會增加一個類型檢查的新功能(PEP 0484 -- Type Hints)。於是滿懷期待的等到昨天新版本一出便立即下載來嘗鮮,然而卻發現功能的實現和原來預想中的並不一樣。就像在stackoverflow(How / why does Python type hinting syntax work?)中提問者的描述一樣,在示例中

def greeting(name: str) -&> str:
return "Hello " + name

print(greeting("Martin"))
print(greeting(1))

運行結果:

Hello Martin
Traceback (most recent call last):
File "test.py", line 5, in &
print(greeting(1))
File "test.py", line 2, in greeting
return "Hello " + name
TypeError: Can"t convert "int" object to str implicitly

Python 解釋器在這段代碼中並沒有對類型做檢查,在後面之所以拋出異常是因為 "Hello"+name的緣故。

然後我又看到其實Python相關語法已經在Python 3.0 PEP 3107 -- Function Annotations 中已經實現,這一次 PEP 0484 -- Type Hints 只是新提供了一個 26.1. typing 來方便做各種類型檢查。比如TypeVar Union Dict 什麼的。

所以我猜想,難道Python 放出這個新功能是為了方便實現一個類型檢查的裝飾器嗎?

於是我自己又寫下如下代碼做驗證:

然而讓人有點失望的是,PEP 0484 -- Type Hints 似乎並沒有起到什麼新的作用,用以前的反射庫 inspect就好了,而且新庫typing會報讓人有點莫名奇妙的錯誤。

Traceback (most recent call last):
File "test_typehit.py", line 30, in &
print(type(inproduct([(5,2),(3,4)])))
File "test_typehit.py", line 20, in _typecheck
print(isinstance(ret,func_arg_annotations["return"]))
File "typing.py", line 423, in __instancecheck__
TypeError: Type variables cannot be used with isinstance().

1. 請問Python 3.5中這個新功能的正確使用方法是什麼???

2. Python 中做類型檢查一般有哪些方法??

3. 26.1. typing 這個庫中 typing.cast 的方法又起到什麼作用呢?

在我的代碼中它似乎什麼作用也沒有。


我的鍋,沒說對。

3.5 只提供了一個統一的類型標註的協議,而沒有提供類型檢查工具。

而在這之前類型標註沒有一個協議,這樣都行:

def foo(a: "這裡傳入一個 dict-like 對象") -&> "也許會返回一個 Shit 對象":
pass

這個協議也不是強制性的,你還可以寫這種代碼,但是就不符合 typing 庫的場景了。

所以需要額外的工具(linter, PyCharm etc)來使用。你還得等工具支持。查了一下 PyCharm 有在支持 Announcing The PyCharm 4.5 EAP Opening


人家都叫 Type Hint 了明顯只是類型標記而不是類型檢查啊


當然是結合 Mypy 來使用了

https://github.com/JukkaL/mypy


目前只是標註,感覺是一個功能的「初級階段」。這個功能可能是JIT。


可以參考 https://github.com/Mohanson/saika , saika.utils.paramscheck 一章 ** new in python3.5 **部分


Type hint 對解釋器的行為沒有任何影響的,解釋器並不進行類型檢查。可能是因為 type hint 記法是在之前的 function annotation 基礎上擴展而來的,而 function annotation 並不僅被用來表達類型約束。

參考:https://www.youtube.com/watch?v=Yqnrfa5ri7E


GitHub - python/mypy: Optional static typing for Python 2 and 3 (PEP484) python3.5的新特性也是參考的mypy的,在python PEP484: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-484 裡面有很清楚的講解說目前這個只是給python增加了一個額外的屬性而已,在運行時不做任何操作,如果想要做靜態類型檢查請使用mypy進行離線檢查。這個特性僅僅是python將其類型進行聲明邁出去的第一步,我相信在後期的python迭代版本里python3解釋器會包含mypy的所有特性。


雖然我也不懂其原理,然而樓上一群人都沒認真看題目


推薦閱讀:

用python去修改linux環境變數為何無效?
編程初學者如何在GitHub尋找適合自己的小項目?
用腳本構建的程序是怎麼保持後期重構的健壯性的?
centos在python3環境下安裝PIP的問題?
python3.x 如何從str中提取bytes?

TAG:Python | Python3x |