關於在Windows作業系統下除錯本書第二十章專案1的一些討論

7song發表於2020-05-30

在討論的開始,我想先申明我的基本觀點:我並非想要吹毛求疵,只是本著讓本書能夠精益求精的,和希望能盡綿薄之力幫助他人的態度和大家一起討論。所以大家如有想法,歡迎評論或者發私信給我。

當一本技術型別書籍的讀者試圖從書中學習一些知識,並完全按照書中所說的做了,卻得不到想要的結果時,讀者的內心必是不滿或者崩潰的。這樣會降低一本書的可信度,並且降低讀者對這本書的忠誠度。我也是通過這本書入門python的,書中內容讀起來輕快有趣,且知識的介紹對新手極其友好。我是本書的讀者,我亦覺得,即使書中有一些不置可否的瑕疵,本書也不失為一本好書,並對作者的python造詣敬畏有加(當以一本好書也離不開譯者的功勞)。我也想把本書推薦給更多人,讓本書擁有更多的讀者,所以我覺得本書應精益求精,不應讓書中小小瑕疵將潛在的粉絲拒之門外。

先來說一說關於程式碼清單20-6的一些小瑕疵。

想必許多新手讀者和我一樣,當按照書上辛辛苦苦鍵入了20-4、5、6程式碼清單的程式碼並儲存後,再按照書上所說的鍵入命令列引數後,命令列會提示如下錯誤: enter image description here

回讀markup.py可以發現,Parser類的內建方法def parse(self, file):及其方法內的程式碼塊都缺少一個標準縮排(4個空格符),將程式碼清單20-6的21-31行都新增一個標準縮排即可解決。

再進行一次相同的命令列操作後,命令列沒有報錯,但開啟生成的html檔案會發現,對於test_input.txt對應的每個文字塊都被顯示了3次。這個問題的根源相對比較隱蔽。仔細校對了清單20-6和生成的test_output.html的原始碼後,發現清單20-6第26-30行都多了一個標準縮排,多餘的縮排讓for rule in self.rules迴圈巢狀在for filter in filters中,故每次檢查rule的時候,都要遍歷filters中的3個filter物件,所以才造成了文字塊被新增3次的現象。要解決問題將多餘的縮排刪除即可。

講到這,我說的問題都本可以提交到勘誤裡,但我為何偏要拙書獻醜呢。其一是當我發現這些問題時,已有相應的勘誤。其二,也是最重要的,我想對於在windows作業系統下測試此專案的讀者給出一些幫助,而這是不能在勘誤裡提及的。

windows是許多新手學者常用的系統(我也如此)。但在windows命令列下鍵入書上所示的命令列引數'python markup.py < text_input.txt > test_output.html'發現根本不管用,別說讓程式按著自己的意思走,就連開始執行程式都是無稽之談(本人沒用過Linux/UNIX OS系統,所以不知在那樣的系統下是否會有此煩惱)。但不管在什麼平臺下,該命令引數意在指出,以test_input.txt作為markup.py的標準輸出,以test_output.html作為markup.py的標準輸出。故在簡單查閱了一些與windows命令列操作有關的記錄後,提出了一個替代方案可以解決該問題。方案如下:

1.在模組handlers開頭新增一行語句: import sys,並將模組handlers下HTMLRenderer類中所有方法內的: print(something),全部改為 print(something, file=open(sys.argv[1], 'a'))

2.將命令列引數'python markup.py < text_input.txt > test_output.html'改為: ' type test_input.txt | python markup.py test_output.html'

現在對於在Windows作業系統下測試專案1的讀者來說,應該能正確地生成相應的.html檔案了。但是如果在Linux/UNIX os系統下鍵入書中命令列有問題的讀者,可以參考本文,但本文不能提供任何相應的解決方法。

可以看的出來,本書所示的所有命令列引數的程式碼,都是基於Linux/UNIX OS系統的。所以希望作者能在本書中能增加一些針對於不同作業系統平臺下讀者的註釋,這定能提高本書的普適性,增加更多不同平臺下的讀者!

最後想說一點心得。學習python基礎教程半月有餘,第一次跟著書本開始嘗試開發專案便遇到了不小的困難(本文上述皆是),對於一個新手來說都是不小的挑戰,但所幸我堅持了下來。我也希望各位希望學到東西的讀者能堅持下來。在本次專案開發中,對於除錯與改錯,我總結了一個對於新手來說比較有用的技巧:當你遇到編譯/直譯器報錯,輸出結果與預期不符等問題時,嘗試以編譯/直譯器如何執行程式碼的思路來查詢解決這些問題。當然,大牛可能會對這個技巧嗤之以鼻--編譯/解釋程式碼是編譯/直譯器的事,學程式設計本就是問了省卻這些麻煩,而如今你卻將之歸結為技巧。這是對的!但對於新手來說,這確實在排錯時有作用,並且有助於新手理解更底層事。

我希望交到更多的朋友,歡迎大家一起討論!

相關文章