:point_up_2:  Python貓 ” ,一個值得加星標的 公衆號

前些天,我寫了《 Python爲什麼使用縮進來劃分代碼塊? 》,文中詳細梳理了 Python 採用縮進語法的 8 大原因。我極其喜歡這種簡潔優雅的風格,所以對它讚美有加。

然而文章發出去後,非常意外,竟收到了大量的反對意見!! (以往文章的互動不多,此次創下了記錄)

我就不截圖了,先摘錄幾則最刺眼的評論:

最大的缺陷就是這個縮進機制

去掉花括號是最愚蠢的設計

絕對是過度設計了,缺陷很大

最大的缺點就是縮進,太反人類了

……

對於這一類的評論,我認爲他們是“睜着眼睛說瞎話”,顛倒是非黑白。Python 的縮進語法如此簡潔好用,怎麼就“過度設計/愚蠢/缺陷/反人類”了?

常言道衆口難調,有人愛甜糉子有人愛鹹糉子,但是對於鹹甜味道,大家是有所共識的,不至於感官紊亂,大放厥詞。

還有比較多的評論,認爲縮進容易造成混亂:

代碼多了,自己看着累,別人更難懂

眼花了,還是括號好些

還是{}或end更清晰

沒有花括號老覺得沒有安全感

縮進層次看不清楚

沒有大括號不便於閱讀

層次一多看起來很亂,不知哪層是哪層,要縮多少。到底退出循環沒有。

看着明明縮進是對的,但運行時總是報錯

用python寫上十萬行試試,到時候你就知道,什麼叫混亂看不下去

……

現在主流的 IDE 工具都很強大,應該善於使用其基本功能,例如:設置顯示空格字符、設置 tab 自動轉化爲空格、設置 tab 鍵爲 4 個空格……同一層級的縮進還會有淺淺的豎線,在視覺上輔助閱讀。

至於說層次過多、代碼很長的情況,這本身就是一種代碼壞味道!當出現過長的函數或者類時, 優秀的程序員 第一時間該考慮的就是重構。推薦一本書《重構:改善既有代碼的設計》,裏面有 正道的價值觀和詳盡的方法論。

還有說點擊右括號,可以看到匹配的左括號,會清晰。有這東西確實不錯,但沒有,我並不訴求。本身緊湊簡潔的代碼,縮進閱讀會很快。

除了以上兩大類的評論,我還收到以下幾種比較有代表性的評論:

  • 有人說“取消花括號會大大降低運行速度”、“這個特性魯棒性太低了”。——這純粹是臆想,讓他們給出論證和例子,無果。別以爲在哪裏看到有人說 Python 慢,就想當然把鍋扣到縮進的頭上。

  • 有人說“多人協同編輯時,有人用tab,有人用空格”。——我說開發團隊應該統一規範,然後用 autopep8 之類的輔助工具。他說規範要不停花精力維護,要花成本。拜託!這年頭還有人不重視代碼規範,直接開除“猿籍”。

  • 有人說“縮進沒辦法自動格式化代碼”。——這在複製移動代碼,或者要改變代碼層級時,有此訴求。我一直用比較笨的方法調節(tab、shift+tab、加減空格),確實是比較笨,但是會比較有把握。剛在 PyCharm 裏研究了一下,我發現它是支持自動格式化的,只是有個小小的問題要注意!

關於縮進的自動格式化,這裏有兩個例子,給大家演示一下:

上述例子,刪除掉那行 if 條件語句,然後直接”ctrl+alt+l“作全局格式化,格式會出錯。我們希望兩句 print 向左縮進 4 格,但是 return 那句也會向左縮進。

在刪除 if 那行後,如果我們只選中兩行 print,作局部”ctrl+alt+l“格式化,那只有這兩行會縮進,就沒問題。

再看第二個例子,我們複製了一段新代碼,但是它的縮進不對:

這時候,若直接“ctrl+alt+l”全局格式化,或者選中那三行再格式化,結果都不對!原因是第二個 if 的縮進格數小於 4 個,所以 PyCharm 認爲它屬於一級縮進(即不該有空格),所以自動格式化時就把它左移了。

如果選中它們,先按 tab 鍵右移(即新代碼變成縮進大於 4 格,小於 8 格):

此時再作格式化的話,它們的縮進就跟第一層的 if 一致了(兩層 if 是兄弟關係)。

同理,如果你想把新代碼縮進到第一層 if 的內部(變爲父子關係),那隻需選中上圖三行代碼再 tab 鍵右移 4 格,之後格式化就可以了!

建議大家在編輯器裏實操一下。等空了我會錄製一期小視頻(B 站搜“Python貓”),敬請留意。

除了上面的評論/觀點之外,我們在微信交流羣裏也討論了這個話題。@櫻雨樓( https://github.com/yingyulou ) 小姐姐的觀點對我挺有啓發。

羣聊截圖已記錄在“Python知識星球”裏( https://t.zsxq.com/jeM33bQ ),其中她提到了編程語言在設計上的“比較抽象和哲學”的兩點:

  • 縮進使得代碼失去了形式語言裏所謂的“上下文無關文法”,從而使得空格+數量的組合變得不再是可有可無的。

  • block 作爲一個“語法組分”,需要一個定界符,而空格一般不作爲語法組分,所以就覺得少了些什麼。

三言兩語沒法轉述清楚,但她談論縮進話題的視角確實令人耳目一新!

上次的文章發出後,有不少小夥伴表示很喜歡 Python 的縮進。我本以爲會聽到很多這類的聲音,沒想到卻是負面的評論更多。(也許更多認同的聲音沒有表現出來)

本文對幾類典型的評論作出了回應,再次表達了我在這個話題上的關注和理解(以及情緒的抒發),希望也能給讀者們帶來一些思考和收穫吧。

相關文章