2008年8月7日 星期四

Python的縮排方式, 空白和tab是有分的啦!!!


這個故事有點笨, 希望沒人跟我一樣....

話說前一陣子申請了google的app engine, 當然是要花時間好好玩一下, 但python其實有點冷門, 用的人很少, 但google用它應該是有道理的, 就試看看吧。花了點時門看了入門說明, 想要測一下程式, 結果一開始就遇到了一些問題, 程式碼一直在某些行出現錯誤(unexpected indent), 怎麼改都一直出錯, 搞了幾個小時還沒搞定, 但直接複製sample code就OK, 被我改過就掛掉, 最後實在氣到把電腦給關了。

過了幾天才有空再開來玩, 因為我是用notepad++來編輯, 它有支援python的keyword都能自動顯示粗體or顏色, 用起來還OK, 但我突然注意到, 每個行首他都會有程式區塊的mark符號, 讓你可以簡單地分辨各個區塊(像是loop or if else等等), 但python並不用C or basic or delphi常用的 {...} or do...loop or begin...end, 而是用最原始的"縮排"來判斷, 並且縮排可用空白or Tab來做, 並不強制。

而我直接copy google的sample code來測試, sample慣用的縮排是2個空白字元, 而我改了幾個地方常常連2個縮排就用1個Tab來做(我把notepad++的Tab設成4個字元), 結果python因為它用縮排來判斷程式區塊, 以至於我有些區塊都被compiler誤判了, 當然就錯誤連連....

結論是, 如果習慣用空白來做縮排, 就請同一個檔案裡都用空白來縮排, 這樣就不會有錯, 若用Tab就全用Tab來做, 後來我是把code全改用Tab來做縮排, 終於所有的錯誤都不見啦!!!

PS: 其實第1天的錯誤訊息就講的很明白(unexpected indent), 但我明明知道它說indent, 但在notepad++裡空白和tab看起來就都完全一個樣呀!!! 除非你把文字游標走過去才能發現.....

2 則留言:

蔡文傑 提到...

你好啊,在大半夜看到這篇文章,我也不禁苦笑了出來
因為我完全遇到了跟你「一模一樣」的狀況
我也是最近為了用GAE而才接觸python的新手,然後也是一樣用Notepad++ 編從google複製過來的程式碼
結果呢...當然就是遇到了跟大大一樣的狀況
為了一個縮排的問題搞的超級頭大。
話說也真是有趣,六年前一樣狀況,在今天居然重演了一遍了

stephenljh 提到...

python 優點很多,最被人痛恨的頭號問題就是 indentation....雖然優點是不用數大括號成對數目(如 C).....