一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python的類(lèi)型系統(tǒng)

zhKF_jqr_AI ? 來(lái)源:未知 ? 作者:李倩 ? 2018-11-24 09:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編者按:Feedly聯(lián)合創(chuàng)始人、大數(shù)據(jù)與機(jī)器學(xué)習(xí)主管Kireet Reddy分享了對(duì)Python類(lèi)型提示的看法。

升級(jí)到Python 3.6后,突然發(fā)現(xiàn)Python通過(guò)typing模塊加入了類(lèi)型提示。我得承認(rèn),我并不非常熟悉python社區(qū),但是我覺(jué)得這樣一種語(yǔ)言特性應(yīng)該會(huì)引起不小的反響。

不管怎么說(shuō),我對(duì)這個(gè)新特性非常滿意。在我職業(yè)生涯的大部分時(shí)間里,我在Java這個(gè)靜態(tài)類(lèi)型的世界中工作,python的類(lèi)型提示多少提供了一些我很懷念的必需結(jié)構(gòu)。

Python的類(lèi)型系統(tǒng)

Python是一個(gè)動(dòng)態(tài)類(lèi)型語(yǔ)言,所謂的“鴨子類(lèi)型”。使用Python編程時(shí),動(dòng)態(tài)類(lèi)型大概是一把至為鋒利的雙刃劍。

基本上這意味著,Python并不會(huì)在編譯步驟預(yù)先檢查所有使用的類(lèi)型是合法的,Python程序?qū)⒗^續(xù)愉快地運(yùn)行下去,直到運(yùn)行不下去為止,這時(shí)它會(huì)拋出一個(gè)TypeError。例如,下面這段Java代碼編譯不過(guò):

publicstaticint add(int a, int b) { return a+b;}

...

add(1, "1");

Java編譯器會(huì)立即抱怨傳入了一個(gè)不兼容的類(lèi)型。然而,你最喜歡的python IDE一點(diǎn)也不會(huì)抱怨這段等價(jià)的Python代碼:

def add(a,b):

return a+b

...

add(1,"1")

你需要運(yùn)行代碼,才能碰到報(bào)錯(cuò)(整型和字符串無(wú)法相加)。

這真是糟糕。但是看看這個(gè):

>>> add(‘hello’, ‘world’)

‘helloworld’

>>> add([1,2,3], [4,5,6])

[1, 2, 3, 4, 5, 6]

好吧,看來(lái)動(dòng)態(tài)類(lèi)型也不完全是壞事。這同樣適用于類(lèi),只要對(duì)象存在恰當(dāng)?shù)姆椒?,python代碼可以直接工作,無(wú)需使用接口

classDog(object):

def talk(self, quietly):

return'woof'if quietly else'BARK'

classCat(object):

def talk(self, quietly):

return'purr'if quietly else'YOWL'

def speak(a, quietly):

print(a.talk(quietly))

>>> speak(Dog())

woof

>>> speak(Cat())

meow

妙!少打很多字,代碼非常凝練。

問(wèn)題

在python項(xiàng)目的起初幾周這讓人感覺(jué)良好。不過(guò)接下來(lái)一周你可能離開(kāi)這個(gè)項(xiàng)目去改進(jìn)以前寫(xiě)的另一些代碼?;蛘吣阈枰鸵粋€(gè)同事一起編程。

過(guò)了一段時(shí)間你回頭看代碼的時(shí)候,或者同事看你的代碼的時(shí)候,看到speak(x)這行會(huì)覺(jué)得x太含糊。于是決定跳轉(zhuǎn)到speak的定義,結(jié)果看到了a.talk。下面就沒(méi)法進(jìn)一步跳轉(zhuǎn)到定義追蹤下去了,需要手動(dòng)搜索查看哪些地方實(shí)現(xiàn)了talk這一方法,接著還需要查看這些方法做了什么,嘗試推斷出speak在talk上施加的一般契約。

解決方案

類(lèi)型提示讓你可以提供更多的上下文。重寫(xiě)上面的代碼:

classDog(Animal):

def talk(self, quietly: bool) -> str:

return'woof'if quietly else'BARK'

classCat(Animal):

def talk(self, quietly: bool) -> str:

return'purr'if quietly else'YOWL'

def speak(a:Union[Dog, Cat], quietly: bool) -> None:

print(a.talk(quietly))

你可能已經(jīng)注意到了,類(lèi)型提示位于冒號(hào)和箭頭之后。注意它傳遞的額外信息。現(xiàn)在我們一眼就能看到speak期望Dog或Cat,而布爾值標(biāo)記指明是否應(yīng)該小聲說(shuō)話(返回小寫(xiě)字母)。如果我們期望將來(lái)有更多說(shuō)話者的類(lèi)型,那么這種寫(xiě)法會(huì)變得累贅嗎?會(huì),但這大概意味著我們應(yīng)該引入基類(lèi)。

沒(méi)有類(lèi)型提示,基本上很難編寫(xiě)不言自明(self-documenting)的代碼。你將不得不重度依賴(lài)極好的命名,一絲不茍的注釋?zhuān)€有代碼的清潔程度。這其實(shí)是相當(dāng)高的門(mén)檻。

一個(gè)額外的好處是,PyCharm等許多IDE支持類(lèi)型提示,如果你沒(méi)有傳入恰當(dāng)?shù)膮?shù),會(huì)通過(guò)下劃曲線標(biāo)出錯(cuò)誤。

我強(qiáng)烈建議在新代碼中使用類(lèi)型提示,接著逐漸更新老代碼。它們不僅為你節(jié)省了一些閱讀代碼的時(shí)間,更重要的是減輕了記住你所有的變量應(yīng)該是什么類(lèi)型的心智負(fù)擔(dān)。

如果你想了解更多關(guān)于類(lèi)型提示的內(nèi)容,請(qǐng)查看python文檔。升級(jí)到Python 3.6后我們?cè)贔eedly強(qiáng)調(diào)了類(lèi)型提示的重要性,后來(lái)我收到了這么一條slack消息:

(譯文:加入feedly前我并不知道python有類(lèi)型提示。有了類(lèi)型提示,閱讀其他人的代碼要容易太多?。?/p>

一切如你所想地工作的時(shí)候,感覺(jué)真不錯(cuò)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70722
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50208
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86715

原文標(biāo)題:給Python加上額外的類(lèi)型提示值得嗎?

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Python中常用的數(shù)據(jù)類(lèi)型

    數(shù)據(jù)類(lèi)型是每種編程語(yǔ)言必備屬性,只有給數(shù)據(jù)賦予明確的數(shù)據(jù)類(lèi)型,計(jì)算機(jī)才能對(duì)數(shù)據(jù)進(jìn)行處理運(yùn)算,因此,正確使用數(shù)據(jù)類(lèi)型是十分必要的,不同的語(yǔ)言,數(shù)據(jù)類(lèi)型類(lèi)似,但具體表示方法有所不同,以下是
    發(fā)表于 04-19 15:14

    總結(jié):一文了解Python中的數(shù)字類(lèi)型

    調(diào)一下Python的變量和數(shù)據(jù)類(lèi)型的關(guān)系,變量只是對(duì)某個(gè)對(duì)象的引用或者說(shuō)代號(hào)、名字、調(diào)用等等,變量本身沒(méi)有數(shù)據(jù)類(lèi)型的概念 。只有1,[1,2],"hello"這一類(lèi)對(duì)象才具有數(shù)據(jù)類(lèi)型
    發(fā)表于 09-26 16:49

    python的數(shù)據(jù)類(lèi)型有哪些?

    python的數(shù)據(jù)類(lèi)型有哪些?Python定義函數(shù)一般格式是什么?
    發(fā)表于 12-27 06:26

    2.2 python字符串類(lèi)型

    2.2 python字符串類(lèi)型1. 如何定義字符串?字符串是Python中最常用的數(shù)據(jù)類(lèi)型之一。使用單引號(hào)或雙引號(hào)來(lái)創(chuàng)建字符串,使用三引號(hào)創(chuàng)建多行字符串。字符串要么使用兩個(gè)單引號(hào),要么
    發(fā)表于 02-17 17:12

    python常見(jiàn)異常類(lèi)型

    python常見(jiàn)異常類(lèi)型在程序運(yùn)行過(guò)程中,總會(huì)遇到各種各樣的問(wèn)題和錯(cuò)誤。有些錯(cuò)誤是我們編寫(xiě)代碼時(shí)自己造成的,比如語(yǔ)法錯(cuò)誤、調(diào)用錯(cuò)誤,甚至邏輯錯(cuò)誤。下面這個(gè)例子,在輸入 if 后輸入回車(chē)了,沒(méi)有按照
    發(fā)表于 03-04 16:59

    Python數(shù)據(jù)類(lèi)型有幾種

    Python編程常用的數(shù)據(jù)類(lèi)型:  1. 數(shù)字類(lèi)型  Python數(shù)字類(lèi)型主要包括int(整型)、long(長(zhǎng)整型)和float(浮點(diǎn)型)
    發(fā)表于 02-18 17:59 ?1650次閱讀

    python字典類(lèi)型的使用和注意事項(xiàng)

    字典類(lèi)型在實(shí)際的python開(kāi)發(fā)中,使用特別頻繁,結(jié)合本人多年的工作經(jīng)驗(yàn),現(xiàn)將字典的使用以及字典使用注意事項(xiàng)總結(jié)如下:
    的頭像 發(fā)表于 01-19 17:49 ?3789次閱讀
    <b class='flag-5'>python</b>字典<b class='flag-5'>類(lèi)型</b>的使用和注意事項(xiàng)

    python教程之變量和簡(jiǎn)單數(shù)據(jù)類(lèi)型

    本文檔的主要內(nèi)容詳細(xì)介紹的是python教程之變量和簡(jiǎn)單數(shù)據(jù)類(lèi)型。
    發(fā)表于 04-26 08:00 ?7次下載
    <b class='flag-5'>python</b>教程之變量和簡(jiǎn)單數(shù)據(jù)<b class='flag-5'>類(lèi)型</b>

    Python并不是弱類(lèi)型語(yǔ)言

    Python是弱類(lèi)型?Python并不是弱類(lèi)型,Python是動(dòng)態(tài)型強(qiáng)類(lèi)型語(yǔ)言。
    的頭像 發(fā)表于 04-21 17:45 ?5215次閱讀
    <b class='flag-5'>Python</b>并不是弱<b class='flag-5'>類(lèi)型</b>語(yǔ)言

    循序漸進(jìn)學(xué)Python之?dāng)?shù)值類(lèi)型

    本文將介紹Python語(yǔ)言的一種基本數(shù)據(jù)類(lèi)型:數(shù)值類(lèi)型。首先,我們會(huì)詳細(xì)介紹Python語(yǔ)言各種數(shù)值類(lèi)型以及相應(yīng)的算術(shù)運(yùn)算和它們的優(yōu)先級(jí)、結(jié)
    發(fā)表于 05-31 15:11 ?4次下載

    2.2 python字符串類(lèi)型

    2.2 python字符串類(lèi)型 1. 如何定義字符串? 字符串是Python中最常用的數(shù)據(jù)類(lèi)型之一。 使用單引號(hào)或雙引號(hào)來(lái)創(chuàng)建字符串,使用三引號(hào)創(chuàng)建多行字符串。字符串要么使用兩個(gè)單引號(hào)
    的頭像 發(fā)表于 02-17 17:08 ?1650次閱讀

    Python的數(shù)據(jù)類(lèi)型與變量賦值

    Python有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類(lèi)型:Numbers(數(shù)字)、String(字符串)、List(列表)、Tuple(元組)、Sets(集合)、Dictionary(字典)。
    的頭像 發(fā)表于 02-10 10:23 ?2228次閱讀

    Python最基本內(nèi)置數(shù)據(jù)類(lèi)型(1)

    最基本內(nèi)置數(shù)據(jù)類(lèi)型 1. 基本數(shù)據(jù)類(lèi)型和運(yùn)算符 python中變量沒(méi)有類(lèi)型,但是對(duì)象都有類(lèi)型 pytho
    的頭像 發(fā)表于 03-08 17:17 ?1164次閱讀
    <b class='flag-5'>Python</b>最基本內(nèi)置數(shù)據(jù)<b class='flag-5'>類(lèi)型</b>(1)

    淺析python的變量類(lèi)型

    python不需要事先聲明變量。 python的變量類(lèi)型是在運(yùn)行過(guò)程中自動(dòng)決定的,不需要代碼聲明類(lèi)型。
    的頭像 發(fā)表于 03-10 10:11 ?1033次閱讀
    淺析<b class='flag-5'>python</b>的變量<b class='flag-5'>類(lèi)型</b>

    python中的set類(lèi)型

    Python中的set類(lèi)型是一種無(wú)序、可變的集合數(shù)據(jù)類(lèi)型,它的主要特點(diǎn)是不允許重復(fù)元素的存在。本文將詳盡、詳實(shí)、細(xì)致地介紹set類(lèi)型的使用場(chǎng)景、常用操作以及與其他
    的頭像 發(fā)表于 11-21 16:25 ?1366次閱讀