記住 Python 變量類型的三種方式

Python作為一門動(dòng)態(tài)語言,其變量的類型可以自由變化。這個(gè)特性提高了代碼的開發(fā)效率黎烈,卻也增加了閱讀代碼和維護(hù)代碼的難度垒手。

假設(shè)有一個(gè)變量is_request_finished蒜焊,從名字上來看,這個(gè)變量的值應(yīng)該為True或者False科贬,在寫代碼的時(shí)候泳梆,最初也確實(shí)是這樣定義的。但是可能由于某些原因榜掌,在某一次賦值的時(shí)候优妙,is_request_finished = 'True'。此時(shí)憎账,如果代碼的單元測試不夠完善套硼,那么if is_request_finishedis_request_finished = Trueis_request_finished = 'True'的時(shí)候都成立,問題被隱藏了胞皱。但是當(dāng)is_request_finished = 'False'的時(shí)候邪意,由于'False'作為一個(gè)非空字符串,就會使得if is_request_finished 依然成立反砌,從而使程序的行為發(fā)現(xiàn)異常雾鬼。

單個(gè)變量的類型異常也許還容易發(fā)現(xiàn),但是如果變量是放在字典或者列表里面宴树,那就比較麻煩了策菜。假設(shè)需要保存一段個(gè)人信息,于是創(chuàng)建了下面這樣一個(gè)列表套字典的數(shù)據(jù)結(jié)構(gòu):

person_list = [{
        'name': 'kingname',
        'age': 23,
        'sex': 'male'
        'detail': {
                    'address': 'xxx',
                    'work': 'engineer',
                    'salary': 100000
            }
},
{
        'name': 'xiaoming',
        'age': 65,
        'sex': 'male'
        'detail': {
                    'address': 'yyy',
                    'work': 'pm',
                    'salary': 0.5
            }
}]

這種方式開發(fā)起來非常的快速而方便森渐,但是其他人甚至是開發(fā)者自己在一段時(shí)間以后讀代碼做入,都會有一種想抽死自己的沖動(dòng)。因?yàn)楦静恢肋@個(gè)變量里面保存的是什么東西同衣。

針對以上問題竟块,常見的解決辦法有三種。

Type Hints 與 Variable Annotations

PEP 484中耐齐,引入了Type Hints浪秘,在PEP 526中引入了Variable Annotations。它使得Python 3.6及以后的Python 代碼擁有了“聲明”變量類型的能力埠况。這里的“聲明”之所以會打引號耸携,是因?yàn)檫@個(gè)聲明是給IDE和人看的。這個(gè)聲明對 Python 的解釋器無效辕翰。

Type Hints

PyCharm現(xiàn)在已經(jīng)可以比較好地支持Type Hints了夺衍。例如下面這一段代碼:

def upload(url):
    print(f'now upload a file to {url}')
    return True

模擬一段上傳文件的函數(shù),上傳成功以后返回True喜命。接收一個(gè)參數(shù)url沟沙。在正常情況下河劝,這個(gè)url應(yīng)該是一個(gè)字符串。于是矛紫,使用Type Hints赎瞎,代碼可以變?yōu)椋?/p>

def upload(url: str) -> bool:
    print(f'now upload a file to {url}')
    return True

如果直接運(yùn)行,其運(yùn)行效果如下圖所示:


現(xiàn)在假設(shè)傳遞一個(gè)不是字符串的變量給upload函數(shù)颊咬,此時(shí)PyCharm就會提示類型有問題务甥,如下圖所示:


但提示歸提示,強(qiáng)行運(yùn)行也是沒有問題的喳篇。這就說明Type Hints主要是給IDE和人用的敞临,解釋器并不會關(guān)心類型正不正確。

如果修改這個(gè)函數(shù)的返回值杭隙,讓它不返回True 或者False哟绊,PyCharm 也會發(fā)出警告:

Type Hints的官方文檔,可以參閱:typing — Support for type hints

Variable Annotations

對于Variable Annotations痰憎,如下圖所示票髓,雖然目前PyCharm還不能很好地提示變量類型不對,但是人在讀代碼的時(shí)候铣耘,還是會起到一定的幫助洽沟。


除了這種寫法外,Variable Annotations還支持把類型寫在注釋中蜗细,如下圖所示:


雖然PyCharm不能起到很好的提示作用裆操,但是可以使用一個(gè)第三方庫mypy來對代碼做靜態(tài)檢查,其運(yùn)行效果如下圖所示炉媒,可以發(fā)現(xiàn)賦值的類型與聲明的類型不一致(expression has type "str", variable has type "bool", 表達(dá)式的類型為“str”踪区,變量的類型是“bool”)。

關(guān)于Variable Annotations的更多用法吊骤,可以參閱:Syntax for Variable Annotations
關(guān)于Mypy缎岗,可以參閱它的官方文檔:Mypy documentation

docstring

在docstring來標(biāo)注變量的類型,如下圖所示:



這種寫法可以用來提示一個(gè)函數(shù)白粉,或者一個(gè)類它里面的各個(gè)變量的情況传泊。但是詳細(xì)程度需要看開發(fā)者有沒有耐心把這個(gè)注釋寫清楚。

Bean

這種方法來自與Java Bean的思想鸭巴,它主要用來解決列表套字典眷细,字典套字典,字典套列表鹃祖,列表套列表這種深層的嵌套關(guān)系溪椎。關(guān)于這個(gè)方法,請參閱另一篇文章:可愛的豆子——使用Beans思想讓Python代碼更易維護(hù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市池磁,隨后出現(xiàn)的幾起案子奔害,更是在濱河造成了極大的恐慌楷兽,老刑警劉巖地熄,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芯杀,居然都是意外死亡端考,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門揭厚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却特,“玉大人,你說我怎么就攤上這事筛圆×衙鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵太援,是天一觀的道長闽晦。 經(jīng)常有香客問我,道長提岔,這世上最難降的妖魔是什么仙蛉? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮碱蒙,結(jié)果婚禮上荠瘪,老公的妹妹穿的比我還像新娘。我一直安慰自己赛惩,他們只是感情好哀墓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喷兼,像睡著了一般篮绰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褒搔,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天阶牍,我揣著相機(jī)與錄音,去河邊找鬼星瘾。 笑死走孽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琳状。 我是一名探鬼主播磕瓷,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了困食?” 一聲冷哼從身側(cè)響起边翁,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硕盹,沒想到半個(gè)月后符匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘩例,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年啊胶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垛贤。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焰坪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聘惦,到底是詐尸還是另有隱情某饰,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布善绎,位于F島的核電站黔漂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涂邀。R本人自食惡果不足惜瘟仿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望比勉。 院中可真熱鬧劳较,春花似錦、人聲如沸浩聋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衣洁。三九已至墓捻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坊夫,已是汗流浹背砖第。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留环凿,地道東北人梧兼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像智听,于是被迫代替她去往敵國和親羽杰。 傳聞我的和親對象是個(gè)殘疾皇子渡紫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 原鏈接:http://www.cnblogs.com/langtianya/p/3757993.html JDK各...
    把愛放下會走更遠(yuǎn)閱讀 1,109評論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)考赛,斷路器惕澎,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • JDK各個(gè)版本的新特性 對于很多剛接觸java語言的學(xué)者來說,要了解一門語言颜骤,最好的方式是從基礎(chǔ)的版本進(jìn)行理解唧喉,升...
    小莊bb閱讀 1,082評論 0 1
  • 常聽有的家長說:小家伙腦子噶笨額欣喧!儂動(dòng)動(dòng)腦經(jīng)呀!這個(gè)題目都不會做梯找。 在幼年階段的確聰明的孩子更容易聽懂學(xué)習(xí)的...
    nicole17閱讀 274評論 0 0
  • 團(tuán)隊(duì)合作項(xiàng)目,使用git時(shí)會發(fā)生這種情況 : 每個(gè)人的代碼格式不同益涧,對比工具再做對比的時(shí)候常常會當(dāng)作沖突來處理锈锤,雖...
    初見破曉閱讀 7,211評論 0 7