學(xué)習(xí)Python擴(kuò)展模塊技巧說(shuō)明
Python擴(kuò)展模塊的開(kāi)源,可移植到多種操作系統(tǒng),只要避免使用依賴(lài)于特定操作系統(tǒng)的特性,Python程序無(wú)需修改就可以在各種平臺(tái)上面運(yùn)行,這么方便的語(yǔ)言一定會(huì)超越現(xiàn)在主流的編程語(yǔ)言。
字符串可以很容易地從文件讀入或向文件寫(xiě)出。讀入數(shù)值要麻煩一些,因?yàn)閞ead()方法總是返回字符串,要把讀入的字符串傳給象string.atoi()這樣的函數(shù)。把象‘123’這樣的字符串轉(zhuǎn)換為對(duì)應(yīng)的整數(shù)值123。但是,當(dāng)你想保存更復(fù)雜的數(shù)據(jù)類(lèi)型如列表、字典或類(lèi)實(shí)例時(shí),讀寫(xiě)就要復(fù)雜得多。
Python的設(shè)計(jì)使程序員可以不必反復(fù)編寫(xiě)調(diào)試保存復(fù)雜數(shù)據(jù)類(lèi)型的代碼,它提供了一個(gè)叫做pickle的標(biāo)準(zhǔn)模塊。這個(gè)令人驚異的模塊可以把幾乎任何Python對(duì)象轉(zhuǎn)換為字符串表示。
這個(gè)過(guò)程叫做腌制,從對(duì)象的字符串表示恢復(fù)對(duì)象叫做恢復(fù)。在腌制和反腌制之間,對(duì)象的字符串表示可以保存在文件或數(shù)據(jù)中,甚至于通過(guò)網(wǎng)絡(luò)連接傳送到遠(yuǎn)程計(jì)算機(jī)上。如果你有一個(gè)對(duì)象x,有一個(gè)可寫(xiě)的文件對(duì)象f,最簡(jiǎn)單的腌制對(duì)象的辦法是下面一行代碼: 為了恢復(fù)對(duì)象,如果剛才的文件已打開(kāi)用于讀取,文件對(duì)象名仍為f。
(腌制和恢復(fù)還有其它用法,可以腌制多個(gè)對(duì)象,可以不把數(shù)據(jù)寫(xiě)入文件,詳見(jiàn)庫(kù)參考手冊(cè))。 pickle是保存Python擴(kuò)展模塊并被其它程序或同一程序以后再運(yùn)行時(shí)調(diào)用的標(biāo)準(zhǔn)辦法。這種做法的專(zhuān)用術(shù)語(yǔ)叫做“持久對(duì)象”。因?yàn)閜ickle使用廣泛,許多Python擴(kuò)展模塊的作者都留意使新增加的數(shù)據(jù)類(lèi)型如矩陣可以正確地腌制和恢復(fù)。
我們常常需要控制輸出格式,而不僅僅是顯示空格分開(kāi)的值。有兩種辦法控制輸出格式:一種辦法是自己進(jìn)行字符串處理。用字符串的片斷和合并操作可以產(chǎn)生任何可以想象的格式。標(biāo)準(zhǔn)模塊string包含了諸如把字符串填充到指定的列寬這樣的有用操作,后面會(huì)有提及。
還有一個(gè)函數(shù)string.zfill(),可以在數(shù)值左邊填零。此函數(shù)可以處理帶有加減號(hào)的情況:
- >>> string.zfill('12', 5)
- '00012'
- >>> string.zfill('-3.14', 7)
- '-003.14'
- >>> string.zfill('3.14159265359', 5)
- '3.14159265359'
- %操作符的用法如下例:
- >>> import math
- >>> print 'The value of PI is approximately %5.3f.' % math.pi
- The value of PI is approximately 3.142.
- 如果有多個(gè)值可以用一個(gè)序表給出,這時(shí)格式字符串中要有多個(gè)格式,如:
- >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
- >>> for name, phone in table.items():
- ... print'%-10s ==> %10d' % (name, phone)
- ...
- Jack ==> 4098
- Dcab ==> 8637678
- Sjoerd ==> 4127
Python擴(kuò)展模塊錯(cuò)誤信息的***一行顯示發(fā)生的情況。例外有不同的類(lèi)型,類(lèi)型作為錯(cuò)誤信息的一部分顯示:上例中錯(cuò)誤的類(lèi)型有ZeroDivisionError、NameError和TypeError。作為例外類(lèi)型顯示的字符串是發(fā)生的例外的內(nèi)置名。這對(duì)于所有內(nèi)置例外成立,但對(duì)用戶(hù)自定義例外不一定成立(用戶(hù)***能遵守這樣的約定)。標(biāo)準(zhǔn)例外名是內(nèi)置的標(biāo)識(shí)符(不是保留關(guān)鍵字)。
此行的其余部分是錯(cuò)誤的細(xì)節(jié),其解釋依賴(lài)于例外類(lèi)型。錯(cuò)誤信息前面的部分以堆棧反跟蹤的形式顯示了發(fā)生錯(cuò)誤的上下文環(huán)境。一般這包含了列出源代碼行的一個(gè)列出源程序行的堆棧反跟蹤;然而,它不會(huì)顯示從標(biāo)準(zhǔn)輸入讀進(jìn)的行。
【編輯推薦】