python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?
前些天,我寫了《Python為什么使用縮進(jìn)來劃分代碼塊?》,文中詳細(xì)梳理了 Python 采用縮進(jìn)語法的 8 大原因。我極其喜歡這種簡潔優(yōu)雅的風(fēng)格,所以對它贊美有加。
然而文章發(fā)出去后,非常意外,竟收到了大量的反對意見!!(以往文章的互動不多,此次創(chuàng)下了記錄)
我就不截圖了,先摘錄幾則最刺眼的評論:
> 最大的缺陷就是這個(gè)縮進(jìn)機(jī)制 > > 去掉花括號是最愚蠢的設(shè)計(jì) > > 絕對是過度設(shè)計(jì)了,缺陷很大 > > 最大的缺點(diǎn)就是縮進(jìn),太反人類了 > > ……
對于這一類的評論,我認(rèn)為他們是“睜著眼睛說瞎話”,顛倒是非黑白。Python 的縮進(jìn)語法如此簡潔好用,怎么就“過度設(shè)計(jì)/愚蠢/缺陷/反人類”了?
常言道眾口難調(diào),有人愛甜粽子有人愛咸粽子,但是對于咸甜味道,大家是有所共識的,不至于感官紊亂,大放厥詞。
還有比較多的評論,認(rèn)為縮進(jìn)容易造成混亂:
> 代碼多了,自己看著累,別人更難懂 > > 眼花了,還是括號好些 > > 還是{}或end更清晰 > > 沒有花括號老覺得沒有安全感 > > 縮進(jìn)層次看不清楚 > > 沒有大括號不便于閱讀 > > 層次一多看起來很亂,不知哪層是哪層,要縮多少。到底退出循環(huán)沒有。 > > 看著明明縮進(jìn)是對的,但運(yùn)行時(shí)總是報(bào)錯(cuò) > > 用python寫上十萬行試試,到時(shí)候你就知道,什么叫混亂看不下去 > > ……
現(xiàn)在主流的 IDE 工具都很強(qiáng)大,應(yīng)該善于使用其基本功能,例如:設(shè)置顯示空格字符、設(shè)置 tab 自動轉(zhuǎn)化為空格、設(shè)置 tab 鍵為 4 個(gè)空格……同一層級的縮進(jìn)還會有淺淺的豎線,在視覺上輔助閱讀。
至于說層次過多、代碼很長的情況,這本身就是一種代碼壞味道!當(dāng)出現(xiàn)過長的函數(shù)或者類時(shí),優(yōu)秀的程序員 第一時(shí)間該考慮的就是重構(gòu)。推薦一本書《重構(gòu):改善既有代碼的設(shè)計(jì)》,里面有正道的價(jià)值觀和詳盡的方法論。
還有說點(diǎn)擊右括號,可以看到匹配的左括號,會清晰。有這東西確實(shí)不錯(cuò),但沒有,我并不訴求。本身緊湊簡潔的代碼,縮進(jìn)閱讀會很快。
除了以上兩大類的評論,我還收到以下幾種比較有代表性的評論:
有人說“取消花括號會大大降低運(yùn)行速度”、“這個(gè)特性魯棒性太低了”。——這純粹是臆想,讓他們給出論證和例子,無果。別以為在哪里看到有人說 Python 慢,就想當(dāng)然把鍋扣到縮進(jìn)的頭上。
有人說“多人協(xié)同編輯時(shí),有人用tab,有人用空格”。——我說開發(fā)團(tuán)隊(duì)?wèi)?yīng)該統(tǒng)一規(guī)范,然后用 autopep8 之類的輔助工具。他說規(guī)范要不停花精力維護(hù),要花成本。拜托!這年頭還有人不重視代碼規(guī)范,直接開除“猿籍”。
有人說“縮進(jìn)沒辦法自動格式化代碼”。——這在復(fù)制移動代碼,或者要改變代碼層級時(shí),有此訴求。我一直用比較笨的方法調(diào)節(jié)(tab、shift+tab、加減空格),確實(shí)是比較笨,但是會比較有把握。剛在 PyCharm 里研究了一下,我發(fā)現(xiàn)它是支持自動格式化的,只是有個(gè)小小的問題要注意!
關(guān)于縮進(jìn)的自動格式化,這里有兩個(gè)例子,給大家演示一下:
上述例子,刪除掉那行 if 條件語句,然后直接”ctrl+alt+l“作全局格式化,格式會出錯(cuò)。我們希望兩句 print 向左縮進(jìn) 4 格,但是 return 那句也會向左縮進(jìn)。
在刪除 if 那行后,如果我們只選中兩行 print,作局部”ctrl+alt+l“格式化,那只有這兩行會縮進(jìn),就沒問題。
再看第二個(gè)例子,我們復(fù)制了一段新代碼,但是它的縮進(jìn)不對:
這時(shí)候,若直接“ctrl+alt+l”全局格式化,或者選中那三行再格式化,結(jié)果都不對!原因是第二個(gè) if 的縮進(jìn)格數(shù)小于 4 個(gè),所以 PyCharm 認(rèn)為它屬于一級縮進(jìn)(即不該有空格),所以自動格式化時(shí)就把它左移了。
如果選中它們,先按 tab 鍵右移(即新代碼變成縮進(jìn)大于 4 格,小于 8 格):
此時(shí)再作格式化的話,它們的縮進(jìn)就跟第一層的 if 一致了(兩層 if 是兄弟關(guān)系)。
同理,如果你想把新代碼縮進(jìn)到第一層 if 的內(nèi)部(變?yōu)楦缸雨P(guān)系),那只需選中上圖三行代碼再 tab 鍵右移 4 格,之后格式化就可以了!
建議大家在編輯器里實(shí)操一下。等空了我會錄制一期小視頻(B 站搜“Python貓”),敬請留意。
除了上面的評論/觀點(diǎn)之外,我們在微信交流群里也討論了這個(gè)話題。@櫻雨樓(https://github.com/yingyulou) 小姐姐的觀點(diǎn)對我挺有啟發(fā)。
縮進(jìn)使得代碼失去了形式語言里所謂的“上下文無關(guān)文法”,從而使得空格+數(shù)量的組合變得不再是可有可無的。
block 作為一個(gè)“語法組分”,需要一個(gè)定界符,而空格一般不作為語法組分,所以就覺得少了些什么。
三言兩語沒法轉(zhuǎn)述清楚,但她談?wù)摽s進(jìn)話題的視角確實(shí)令人耳目一新!
上次的文章發(fā)出后,有不少小伙伴表示很喜歡 Python 的縮進(jìn)。我本以為會聽到很多這類的聲音,沒想到卻是負(fù)面的評論更多。(也許更多認(rèn)同的聲音沒有表現(xiàn)出來)
本文對幾類典型的評論作出了回應(yīng),再次表達(dá)了我在這個(gè)話題上的關(guān)注和理解(以及情緒的抒發(fā)),希望也能給讀者們帶來一些思考和收獲吧。
總結(jié)
以上是生活随笔為你收集整理的python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python gdb coredump_
- 下一篇: python获取div标签的id_Pyt