前程式設計客棧言
大家都知道python 是一門強型別、動態型別檢查的語言。所謂動態型別,是指在定義變數時,我們無需指定變數的型別,python 直譯器會在執行時自動檢查。
與靜態型別語言(如 c 語言)相比,這不僅僅是少寫了幾個型別宣告字元:
#include
#include
#define buff 100
char* www.cppcns.comgreeting(char* name)
int main()
def greeting(name):
return "hello, {}!".format(name)
def main():
print("greeting: " % greeting("python35"))
if __name__ == '__main__':
main()
動態型別從一定程度上將我們的思維從對計算機的工作模擬中解放出來,可以將更多精力集中在需要解決的問題上:就像上面的例子,我們不需要費心思考慮greeting函式所接受的引數是什麼型別、返回值是什麼型別,而只需要考慮greeting函式需要實現的功能即可。
當然並不是說動態型別一定優於靜態型別,上面的例子用 c 語言和 python 相比也有失公允,如果換成 go 語言:
package main
import "fmt"
func greeting(name string) string
func main()
靜態型別的優勢(從某種程度上說也是缺點)在於定義方法時制定一種強制性的協議(介面),只有遵循協議才能正確地使用。這對多人合morzngdks作、開發第三方庫、快速定位 bug 等是很有幫助的。靜態型別還有一大優勢是可以讓 ide 幫助提示介面用法和型別檢查,進一步提高效率。既然有這麼多優勢,那 python 要不要也學習乙個?實際上 python 3.5 中的 pep 484 和 python 3.6 的pep 526 分別加入了型別提示(type hints)的語法,其中 pep 484 主要關於函式、方法、類的引數和返回值的型別宣告語法,而 pep 526新增了對變數型別的宣告:
def greeting(name: str) -> str:
return "hello, {}!".format(name)
mypy
mypy 是官方推薦乙個靜態型別檢查工具:
python3 -m pip install mypy
可以用 mypy 命令直接檢查 python 程式:
mypy greeting.py
為了方便使用,可以將其應用到 ide 中,以 atom 為例,可以安裝外掛程式linter-mypy:
python3 -m pip install typed-ast
apm install linter
apm install linter-mypy
mypy 支援的常用型別如下表所示(來自官方文件):
其中list/dict/iterable/sequence/any來自標準庫 typing。這裡的 sequence和iterable分別對應collections.abc.sequence和collections.abc.iterable,簡單來區分sequence是可以通過數字下標索引的,而iterable可以代表生成器:
python 2.x
新增了型別注釋的**可以直接通過 python 3.5 直譯器執行,但是對於 python 2.x 則是完全不相容的。如果要在 python 2.x 中使用,首先需要安裝 typing:
pip install typing
然後可以用單行注釋的形式強行新增:
def send_email(address, # type: union[str, list[str]]
sender, # type: str
cc, # type: optionamorzngdksl[list[str]]
bcc, # type: optional[list[str]]
subject='',
body=none # type: list[str]
):# type: (...) -> bool
"""send an email message. return true if successful."""
pass
總結python 3.5+ 從語法上支援靜態型別提示,在不影響正常使用習慣的情況下為我們提供靜態型別檢查的功能,雖說不能與真正的靜態型別語言相比,但也保證了更大的靈活性,這也符合 python 的一貫的設計思想:「it's a tool, not a rule.」好了,以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流。
本文標題: python中型別檢查的詳細介紹
本文位址:
python引數型別檢查 Python中的型別檢查
本文中所有 均執行在python 2.7上 為什麼要進行型別檢查?總所周知,python是一門典型的動態語言,在變數定義 使用的過程中遵循duck typing,當對某一變數進行操作時才去檢查它是否支援該操作。這在大多數情況下沒有什麼問題。但有時我們希望當面對非法型別的引數的時候採取某些預設處理機制...
Protobuf 中的型別檢查
在使用protobuffer時,如果定義乙個訊息如下 enum my enum enum type1 1,enum type2 2 message my msg required my enum test enum 1 那麼,在protoc生成的 中,在賦值時 set test enum const...
javascript中object型別介紹
constructor 儲存著用於建立當前物件的函式 hasownproperty propertyname 用於檢測給定的屬性在當前物件的例項中 而不是在例項的原型中 是否存在 其中作為引數屬性名的 propertyname 必須以字串形式指定 eg o.hasownproperty name i...