在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
一直以來,在寫程式時總有個小小的困擾,雖不影響程式的正確性和執行結果,但總覺得彆扭。什麼困擾呢?就是程式碼風格的問題。程式碼風格指的是什麼?也沒什麼特別的,就是排版啦、變數名稱的寫法啦、要用大寫還是小寫啦等等。有時候覺得這樣寫不錯,可是過陣子又覺得那樣不好,應該改一改,就光是縮排要三格還是四格這麼簡單的一件事,都可以來來回回變了好幾回。現在既然官網上有這文件,那就照裡頭的指引和建議寫,不用再傷腦筋了。
很快地把文件看過一遍。老樣子!看了後面忘了前面。
在看的過程中,注意到文件裡頭提到,每行最多不要超過79個字元,而註解和docstrings,不要超過72個字元。所以囉,那乾脆就每行都不要超過72個字元得了。看到這規範時,不由得就想起FORTRAN這個古老的程式語言。
那時大一,還是在用5.25”磁碟片的個人電腦上古時代,學的就是FORTRAN。那時的FORTRAN規定,程式碼要寫在第7~72格之間,前面幾格,就留給註解符號「C」和行號用。為什麼會有這規定?據說是因為FORTRAN誕生時,還沒有鍵盤這玩意兒,要靠卡片輸入。那個卡片長得就像考試時要用2B鉛筆劃來劃去的卡片,能寫的範圍就那麼大,所以才會限制程式碼只能寫在固定範圍內。現在連FORTRAN都沒這限制了,Python幹嘛要計較這個?而且現在的螢幕大得很,還越來越大,長長的程式碼,應該不會造成什麼困擾啊!不過根據文件的說明,之所以有這規範,就是在讀程式時,可以開兩個視窗,然後新、舊程式並列在一起,便於工作。另外一個原因,是避免編輯器自動換行所造成的版面混亂,畢竟有些編輯器有自動換行功能,有些沒有,這會造成一些困擾。看來挺有道理的,不是嗎?不過讀到變數名稱的寫法規範時,我就覺得有點不太認同了。
變數名稱的寫法有很多種,如果要節省空間,那camel case應該是比較好的選擇。可是Python卻選了lower_case_with_underscores這種寫法。既然希望每行不要超過72個字元,怎麼不用camel case?用底線的寫法,不是比較會因為超過72個字元而需要切斷換行嗎?實在是不知道用意何在!不過既然文件這麼定,那就這麼寫吧!
其他的還有例如空格、逗號、冒號、刮號等等的用法,其實都跟英文標點符號的排版方式差不多。例如,英文的標點符號是直接接在單字後面,中間沒有空格,後面空一格:We need five animals: two dos, two cats and a horse. 在Python中也是這麼寫,例如:for i in range(2,5):。比較特別的是冒號,可以當標點符號,也可以是operator。如果是operator那就要遵照operator的寫法,例如,要寫成a[3:5],而不是a[3: 5],冒號後面不要有空格。
這林林總總的風格規範,目的其實很單純:提高程式碼的可讀性,以及不同作者程式碼風格的一致性,就如同大家講共同的語言,溝通會比較順暢一樣。Python很看重程式碼的可讀性,在The Zen of Python裡頭就有Readability counts. 這麼一條,也基於這樣的理念,連在程式語法的設計上,都有跟別人不一樣的設計。例如,在Design and History FAQ這份文件中就提到,用縮排來區分程式區塊、在if/while/def/class等statement中,要用到「冒號」等,這些讓我一開始挺不習慣的寫法,原來都有這麼些個考量在。