教你用Type Hint提高Python程式開發效率,hintpython

來源:互聯網
上載者:User

教你用Type Hint提高Python程式開發效率,hintpython

簡介

Type Hint(或者叫做PEP-484)提供了一種針對Python程式的類型標註標準。

為什麼使用Type Hint?對於動態語言而言,常常出現的情況是當你寫了一段代碼後,隔段時間你可能忘記這個方法的原型是什麼樣子的了,你也不清楚具體應該傳入什麼類型的參數,這樣往往需要你去閱讀代碼才能定義每個類型具體是什麼。或者當你使用一個文檔並不是特別完全的第三方庫,你不知道這個庫應該如何使用,這都會很痛苦。

現在,藉助Type Hint,你可以實現:

     1、實作類別型檢查,防止運行時出現的類型不符合情況。

     2、作為文檔附加屬性,方便開發人員調用時傳入傳出的參數類型。

     3、提升IDE的檢查機制,在智能提示時更快給出提示和類型檢查結果。

實現這個過程中,你需要使用Python 3.5+中提供的新模組typing值得注意的是,這個改動並不會影響程式運行,僅僅是為了方便類型檢查器實現的。

Type Hint類型檢查器

目前,比如JetBrains家的PyCharm已經支援Type Hint語法檢查功能,如果你使用了這個IDE,可以通過IDE功能進行實現。如果你像我一樣,使用了SublimeText編輯器,那麼第三方工具mypy可以協助到你。AnacondaST3最近要發布的2.0版本也內建了mypy功能的支援,具體的進度可以看一下這個issue。一些其它的Python工具(比如代碼提示工具jedi 0.10+)也支援了Type Hint功能。

從簡單的例子開始

從簡單的例子開始,我們先從一個簡單的程式開始,運行環境為Python 3.5.2,使用mypy工具進行檢查。

首先通過pip install mypy-lang命令安裝mypy工具。注意是mypy-lang,之所以是這樣,是因為在pypi裡mypy這個名字已經被佔用掉了。

接下來,通過mypy檢查下面這個檔案

# fib.pyfrom typing import Iteratordef fib(n: int) -> Iterator[int]:  a, b = 0, 1  while a < n:    yield a    a, b = b, a + bi = fib(3.2)print(next(i))print(next(i))

在命令列中執行命令mypy fib.py,擷取返回結果:

➜ mypy fib.pyfib.py:11: error: Argument 1 to "fib" has incompatible type "float"; expected "int"

但是在實際的應用過程中,這個功能在Python裡是可以正常啟動並執行:

➜ mypy python fib.py01

可以看到,mypy工具提示了我們的代碼中存在一處類型不符的問題,但是如果不進行檢查,代碼有可能執行出不可預知的結果。

在這個例子裡面,我們使用了兩種類型,一種是Python基礎資料類型,比如str、int等等,這些類型資料是可以直接使用的;另外一種是來自於typing中引入的Iterator,用來表示迭代器類型。另外一個值得注意的是,typing中部分類型也會隨時添加,一般我們以示範版本為準。

從簡單到複雜,類型組合怎麼辦?

實際上,在我們使用過程中還有可能傳遞一些更加複雜的參數類型,比如list類型,tuple類型等等,這類型的資料如何聲明呢?我們可以先看一個例子:

def foo(strings, string_list, count, total):

這個函數的參數我們從字面可以看出來分別是str,元素為str的list類型和兩個整數參數。我們假定一個傳回值為((int, int), str),那麼這個類型檢查可以這樣定義:

from typing import List, TupleResult = Tuple[Tuple[int, int], str]def foo(strings: str, lines: List[str], line_number: int, total_lines: int) -> Result:

其它的一些類型提示、協程等等的支援都可以在官方的typing模組文檔中進行查看。

關於生產的一些閑扯

我們現在也在進行一些mypy工具在生產環境中的具體使用測試,但是我們也發現了一些存在的問題,比如Python本身的動態語言特性給類型標註就帶來了一些麻煩。另外,變數複用導致的類型變換有可能會提示採用新的變數實現。這對於一個已經存在的線上項目來說相對成本較高,我們後續也會在一些新項目中採用這種方式。另外mypy還是一個比較新的項目,本身是擁有一些bug。另外一個是在某些mypy的非類型錯誤提示其實非常的模糊,導致很多錯誤有時需要進行人工排查。

不管怎樣,即便在mypy存在一些缺陷,但是仍舊是未來非常有潛力的工具,提前瞭解和應用也能有效提升程式的強壯性。以上就是利用Type Hint提升Python程式開發效率的全部內容,希望本文對大家使用python有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.