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