mypy 支援靜態型別程式設計的python變種

2021-09-22 13:24:19 字數 1875 閱讀 5313

每種程式語言都有一群固定的使用者,對於那些習慣將不同程式語言用成同樣的感覺的人來說,最是難受。因為每種語言都有它獨特的設計『哲學』和擅長的應用領域。

php給大家的一貫的印象都是動態弱型別語言,python是動態強型別語言。

就像我用慣了php的標量型別宣告-起到一點靜態型別的感覺,讓我去用python的完全動態,可能是不習慣的。而強型別在大型專案中,是基本質量的保證。

mypy出現了。正如facebook出了hack lang - php的靜態型別版,mypy也是python的靜態型別版;儘管兩者的實現原理有所不同。

python程式語言的設計者guido van rossum,在python-ideas郵件列表中提出了乙個建議:在python函式宣告中加入型別注釋。這個建議旨在在不改變python動態型別的本質和直譯器行為的前提下,讓python獲得靜態型別系統所帶來的好處。

其目標是,在不改變程式執行邏輯的情況下,通過(未修改的)python 3.5直譯器執行時,能夠對第三方模組(甚至是stdlib)新增型別檢查注釋。

guido所提出的新增型別注釋的建議源自於bob ippolito和jukka lehtosalo的想法。bob ippolito主張將haskell的一些特性引入到python和其他語言中。jukka lehtosalo則是mypy的作者,這是乙個帶有試驗性質的python變種版本,旨在將動態型別和靜態型別的好處結合起來。

mypy是guido建議中的主要內容。在建議中,guido說到,可以將mypy看成乙個用於python的、類似lint的靜態檢查器。用於在編譯期或是在mypy的python直譯器下執行時,檢查程式中型別的正確性。另一方面,程式在python官方的直譯器下執行時,能夠不受型別注釋的影響。因此也不會有執行時型別檢查的開銷。為了達到這一點,關鍵在於用於型別注釋的語法必須符合python 3的語法。這也是mypy的乙個特性。實際上,mypy在指定型別簽名的時候使用了函式注釋這個python 3的語法。該語法允許為函式新增任意元資料注釋。

def f(t: tuple[int, str]) ->

none:

t =1, 'foo'

# ok

t ='foo', 1

# type check error

def greeting(name: str) ->

str:

if name:

return

'hello, {}'.format(name)

else:

return

'hello, stranger'

print(greeting('python')) # okay!

print(greeting(none)) # also okay!

class a:

def__init__(self, x: int) ->

none:

self.x = x # attribute x of type int

a = a(1)

a.x =

2# ok

a.y =

3# error: a has no attribute y

隨著python3.6的發布,python的註解規範已經支援變數型別標註:

primes: list[int] = 

captain: str

# note: no initial value!

class starship:

stats: classvar[dict[str, int]] = {}

python3中,這些型別註解只會在執行型別檢測時提示,實際執行的時候不會發生作用。

py程式設計 小白新奇的技巧

1 同時遍歷乙個列表的索引和元素 3 關於jupyter conda不顯示conda裡存在的環境的問題 首先需要安裝 conda install ipykernel啟用對應的conda環境 source activate 環境名稱將環境寫入notebook的kernel中 python m ipyk...

mysql支援 mysql支援的資料型別

mysql支援的資料型別 一 整型 型別 tinyint 1位元組,取值範圍 128 127,預設長度4 smallint 2位元組,取值範圍 32768 32767,預設長度6 mediumint 3位元組 int 4位元組 2147483648 2147483647 bigint 8位元組 約束...

VBA支援的變數型別

no.type size in memory range of values 1 byte 8 bits 0 to 255 2 boolean 16 bits true or false 3 integer 16 bits 32768 to 32767 4 long 32 bits 21474836...