十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹“Python動(dòng)態(tài)類型存在哪些問(wèn)題”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Python動(dòng)態(tài)類型存在哪些問(wèn)題”文章能幫助大家解決問(wèn)題。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),萬(wàn)山網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:萬(wàn)山等地區(qū)。萬(wàn)山做網(wǎng)站價(jià)格咨詢:028-86922220
Python作為動(dòng)態(tài)語(yǔ)言,代碼簡(jiǎn)潔、靈活,拋開(kāi)運(yùn)行效率不說(shuō),但存在的一些問(wèn)題也是事實(shí),例如:
1、IDE的智能提示比較雞肋,舉個(gè)例子,字符串有個(gè) startswith 方法,你很容易忽略中間那個(gè)“s”,如果么有 IDE 的幫助,不得不去查個(gè)文檔。(其實(shí)現(xiàn)在的PyCharm 已經(jīng)非常智能了,即使沒(méi)有類型聲明。)
2、大部分錯(cuò)誤只有在程序運(yùn)行的時(shí)候才能被發(fā)現(xiàn),編譯過(guò)程中只能發(fā)現(xiàn)簡(jiǎn)單的語(yǔ)法錯(cuò)誤。
3、接口調(diào)用全靠文檔注釋說(shuō)明,雖然我們可以使用 docstring,但是代碼更新之后,你的 docstring 可能就沒(méi)有同步更新。
這些問(wèn)題在大型項(xiàng)目,特別是多人合作的項(xiàng)目上顯得更為突出。所以遵循代碼規(guī)范、Code Review 就變得尤為重要,如果能從語(yǔ)法層面上去規(guī)范代碼無(wú)疑是最省成本的,所以在 Python3.5,也就是 PEP484 中就有了類型提示(Type Hints)。定義函數(shù)時(shí),可以你指定函數(shù)的返回值類型、參數(shù)的類型。
以前定義一個(gè)函數(shù)可以接收任何類型的數(shù)據(jù):
def greeting(name):
return "Hello" + name
greeting("bob")
greeting(1)
程序運(yùn)行前,不會(huì)有任何錯(cuò)誤提示,雖然我們知道字符串和數(shù)字是不支持“+”操作的。
在 Python3.5 中,用 Type Hint 寫法是這樣的:
def greeting(name: str) -> str:
return 'Hello ' + name
上面就是靜態(tài)類型的寫法,多了 「: str」與 「-> str」,前者用來(lái)說(shuō)明 name 的類型,后者指函數(shù)返回值的類型,我們?cè)趯懘a的過(guò)程中IDE也能提示我們寫得不對(duì):
除了 IDE 之外,我們還有更強(qiáng)大的靜態(tài)類型檢查工具,叫 mypy,這個(gè)工具也是由 Python 之父 Guido 親自操刀實(shí)現(xiàn)的靜態(tài)類型檢查工具。
# 先安裝mypy
pip install mypy
$ mypy test.py
test.py:4: error: Argument 1 to "greeting"
has incompatible type "int"; expected "str"
有了類型提示,Python在代碼調(diào)用、重構(gòu)、甚至是靜態(tài)分析等方面有了更好的效果,不但減輕了開(kāi)發(fā)時(shí)自行進(jìn)行型態(tài)檢查的負(fù)擔(dān),更重要的是,由于有了型態(tài)上的提示,讓過(guò)去 Python 整合開(kāi)發(fā)工具上做不好的各種智能提示、重構(gòu)等功能有了統(tǒng)一的參考標(biāo)準(zhǔn)。
某種意義上類型提示只是一種輔助功能,雖然我們加了數(shù)據(jù)類型提示,但是對(duì)于 Python 解釋器來(lái)說(shuō),它會(huì)直接忽略掉類型提示信息,哪怕類型有誤也不會(huì)阻止程序的運(yùn)行。
而對(duì)于變量的類型聲明,在 PEP484 中可以通過(guò)類型注釋來(lái)說(shuō)明,就是以注釋的方式來(lái)說(shuō)明變量的類型,例如:
from typing import List
x = [] # type: List[Employee]
y = [1, 2] # type: List[int]
y.append("a")
在 Python3.6,也就是 PEP526 的提案中,針對(duì)變量注解做了進(jìn)一步優(yōu)化,將類型的聲明作為了語(yǔ)法的一部分,這樣比起注釋可讀性更強(qiáng),例如:
my_var: int # 聲明為整數(shù)類型的變量
my_var = 5 # 通過(guò)類型檢查
other_var: int = 'a' # 給整數(shù)類型變量賦值字符串,檢查器會(huì)報(bào)錯(cuò),但是解釋器運(yùn)行是不會(huì)有任何問(wèn)題
print(other_var)
運(yùn)行mypy
mypy xx.py # 運(yùn)行類型檢查器
xx.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int")
python test.py # 運(yùn)行解釋器
擁有了強(qiáng)大的類型提示之后,你還敢說(shuō)重構(gòu)代碼是火葬場(chǎng)嗎?不過(guò)我反倒覺(jué)得動(dòng)態(tài)語(yǔ)言變得越來(lái)越臃腫起來(lái),例如:
T = TypeVar('T')
S = TypeVar('S')
class Foo(Generic[T]):
def method(self, x: T, y: S) -> S:
# Body
這讓一門原本簡(jiǎn)潔優(yōu)雅的語(yǔ)言跟Java一樣臃腫了,好在類型提示在Python中只是一種可選操作,而且對(duì)解釋器來(lái)說(shuō)完全是不可見(jiàn)的。而且這種寫法也不是Python 的主流做法,大家可以去看看主流框架的源碼,很少用這種特性。
關(guān)于“Python動(dòng)態(tài)類型存在哪些問(wèn)題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。