Python 2.3 的新特性
Python 2.3 的新特性
以下是 Python 2.3 中新特性的(主觀)亮點。
更快
根據幾個簡單基準測試,Python 2.3 比 Python 2.2.3 快大約 20-30%。部分加速是透過刪除 SET_LINENO 操作碼實現的,這意味著當比較“python -O”時,差異不那麼明顯;其餘的是各種仔細的調整。
新工具
IDLE 的全新版本(來自 SourceForge 上的 IDLEfork 專案)現在作為 Lib/idlelib 包含在內。舊的 Tools/idle 不再存在。
新的或升級的內建函式
- sum()- 一個新的函式,用於對數字序列求和。“sum(seq, start)”比“reduce(operator.add, seq, start)”更快且更容易理解。(在 2.3b1 中新增。)
- enumerate()- 一個迭代器,接受一個序列,返回 (index, item) 的元組。這更優雅地解決了舊的“for i in range(len(seq))”問題。(PEP 279)
- basestring- 一個抽象的字串型別,它是 str(8 位字串)和 unicode 的基類。主要用於簡化字串型別的測試,即 isinstance(x, basestring)。
- bool、True、False- 這些在 Python 2.2.1 中被引入為整數,但現在是一個單獨的型別(整數的子型別)。這意味著 True 和 False 現在分別列印為字串 'True' 和 'False'。從 2.3b1 開始,不帶引數的 bool() 返回 False。(PEP 285)
- compile()、 eval()、 exec- 完全支援 Unicode,並且當它們的輸入不以換行符結尾時,不再發出 SyntaxError。(在 2.3a2 中新增。)
- range()- 從 2.3b1 開始,支援大小大於 sys.maxint 的長引數。例如,range(2**100, 2**101, 2**100) 是以下列表:[1267650600228229401496703205376L]。
- dict()- dict 構造的兩個新特性:dict() 建構函式的關鍵字引數現在是根據鍵/值對建立字典的簡寫形式,而 dict.fromkeys(iterable) 返回一個字典,其鍵取自給定的可迭代物件(值預設為 None)。還添加了一個新的 dict 方法 pop(key),它刪除並返回與給定鍵對應的值。
- filter()- 當輸入為 Unicode 時,現在返回 Unicode。修復了內建型別子類的各種錯誤。(在 2.3a2 中新增。)
- int()- 現在當轉換具有許多數字的字串時,可以返回長整型,而不是引發 OverflowError。(在 2.3a2 中新增:當對無符號十六進位制或八進位制文字進行符號摺疊時,發出 FutureWarning。)
- isinstance()、 super()- 現在支援 type() 不等於其 __class__ 的例項。(在 2.3a2 中新增。)從 2.3b1 開始,super() 不再忽略資料描述符,除了 __class__。
- raw_input()- 現在可以返回 Unicode 物件(如果 sys.stdin 具有 Unicode 功能)。(在 2.3a2 中新增。)
- slice()和buffer()- 這些現在是型別而不是函式。建構函式具有與過去函式相同的簽名。
- PyThreadState_SetAsyncEnc()- 一個新的 API(特意只能從 C 訪問),透過向執行緒傳送異常來中斷執行緒。
新的或升級的模組和包
許多新的doctestJim Fulton 的擴充套件,除其他增強功能外,還允許透過 unittests 執行 doctest。
csv- 支援以所謂的逗號分隔值格式讀取和寫入檔案。(在 2.3b1 中新增。)
timeit- 用於計時程式碼片段速度的模組。(在 2.3b1 中新增。)
platform- 找出你一直想了解但又不敢問的關於你平臺的一切。(在 2.3b1 中新增;由 Marc-Andre Lemburg 編寫。)
shelve- 可選擇支援自動寫回,並公開 pickle 協議版本。(在 2.3b1 中新增。)
DocXMLRPCServer- 一個自文件化的 XML 伺服器庫。(在 2.3b1 中新增。)
rotor- 此模組已棄用。它太容易被破解了。(在 2.3b1 中新增。)
re- .*? 模式現在被特殊處理以避免遞迴限制。(在 2.3b1 中新增。)
Bastion和rexec- 這些模組被停用,因為它們在 Python 2.3(以及 Python 2.2)中不安全。(在 2.3a2 中新增。)
bsddb- 舊的 bsddb 模組最終被棄用。以前的第三方 PyBSDDB 包裝器現在在 Python 2.3 中可用,作為 bsddb 包。這與 Sleepycat Berkeley DB 3.0 到 4.1 版本相容。在 2.3a2 中新增:Windows 安裝程式現在附帶 Sleepycat 的 4.1.25.NC,這是沒有強加密的最新版本。
舊的 bsddb 模組程式碼仍然可以作為 bsddb185 模組使用,但預設情況下不構建此模組。如果您仍然使用僅安裝了 Berkeley DB 1.85 的系統(通常透過存在 /usr/include/db.h 但不存在 /usr/lib/libdb.a 檔案來指示),則以下更改應使您能夠繼續執行。
新增此行
bsddb185 bsddbmodule.c
到 Modules/Setup 中。在大多數情況下,您不應需要任何 -I、-L 或 -l 標誌。在那些仍然隨附 1.85 的系統上,/usr/include/db.h 似乎是包含檔案,並且符號存在於 libc 中。
要強制將該版本的模組用作匯入名稱“bsddb”時的預設值,請將以下行新增到您的 sitecustomize.py 檔案中
import bsddb185 as bsddb
bz2- 與 Gustavo Niemeyer 提供的 bz2 壓縮庫的介面。
datetime- 由 Tim Peters 編寫的 C 語言快速緊湊的日期和時間計算實現,範圍從 1 年到 9999 年,並可選支援時區;(在 2.3a2 中新增:太多無法在此處列出;請參閱Misc/NEWS。)
heapq- 實現從一年級演算法課程中瞭解的堆佇列演算法。Kevin O'Connor 編寫的程式碼,François Pinard 編寫的文件,Tim Peters 做了許多改進。
imaplib- 添加了 SSL 支援。
imp- 公開了“匯入鎖”。(在 2.3a2 中新增。)
itertools- 受 Haskell 和 SML 啟發的,高速、記憶體高效的迴圈結構。(在 2.3a2 中新增。)(在 2.3b1 中進行了一些改進,包括將 times() 併入 repeat(),以及新增 chain() 和 cycle()。)
logging- 一個靈活的、可配置的日誌記錄包,基於 log4j 和我們自己的 PEP 282;由 Vinay Sajip 編寫。(在 2.3a2 中新增:warn/WARN 重新命名為 warning/WARNING;日誌記錄模組實際上包含在 Windows 安裝程式中。)
optparse- 一個強大的命令列選項解析器,由 Greg Ward 編寫(基於他的 Optik 包)。
ossaudiodev- 一個到 OSS(開放聲音系統)的介面,OSS 是 Linux 和某些 BSD 風格的標準音頻 API。Greg Ward 編寫的程式碼,基於 Peter Bosch 提供的(現已棄用的)linuxaudiodev 模組。(在 2.3a2 中新增:由於驅動程式問題,除非使用“regrtest.py -u audio”,否則預設情況下不執行這些模組的測試。)
pickle, cPickle和copy- 添加了一個新的 pickle 協議,用於更高效地 pickle(特別是)新式類例項,並允許更多的 pickle 靈活性。(PEP 307)(在 2.3a2 中新增。)
random- 現在使用新的核心生成器,梅森旋轉演算法。這是當前最佳實踐的隨機數生成器演算法,經過廣泛測試,週期為 2**19937-1。由 Raymond Hettinger 編寫的程式碼。
sets- 一個實現兩個靈活的集合資料型別的新模組。由包括 Greg V. Wilson、Alex Martelli、Tim Peters 和 Raymond Hettinger 在內的許多人編寫的程式碼。(PEP 218)
socket- 現在,套接字支援對所有操作設定可選超時。Michael Gilfix 和 Bernard Yue 編寫的程式碼,基於 Tim O'Malley 的 timeoutsocket.py。此功能中的一些錯誤已在 2.3b1 中修復;因此,所有平臺現在都對套接字物件使用 Python 包裝器類。在 2.3b1 中也新增了對 inet_pton() 和 inet_ntop() 的支援。
ssl- Windows 安裝程式現在包含 SSL 支援。(在 2.3a2 中新增:現在正確處理在底層套接字上設定的超時。)
Tkinter- 現在返回 Tcl 物件而不是字串。刪除了對 Tcl/Tk 8.0 和 8.1 的支援;添加了對執行緒 Tcl/Tk 的支援,以及對各種 Tk 8.4 功能的支援。Windows 安裝程式現在附帶 Tcl/Tk 8.4.3。在 2.3b1 中,變數包裝器現在也將物件直接傳遞給 Tcl,而不是將其轉換為字串。
trace- 一個用於跟蹤程式執行並報告程式碼覆蓋率的工具
textwrap- 簡單但有效的文字段落包裝,由 Greg Ward 編寫。
zipimport- 從 zip 檔案匯入模組,由 Just van Rossum 基於 James Ahlstrom 早期的程式碼用 C 實現。(2.3a2 中的新特性:修復了 2.3a1 中發現的幾個嚴重錯誤。)
通用
- PYTHONINSPECT- 現在程式可以在 Python 中將環境變數 $PYTHONINSPECT 設定為某個字串值,從而使直譯器在程式退出時進入互動提示符,就像使用 -i 選項呼叫 Python 一樣。
- os.walk()- 基於生成器的 os.path.walk() 替代品。(2.3b1 中的新特性。)
- os.fsync()- 現在在 Windows 上也支援。(2.3b1 中的新特性。)
- winsound.MessageBeep()- Windows 上的新函式。(2.3b1 中的新特性。)
- time.tzset()- 平臺 tzset() 的介面。(2.3b1 中的新特性。)
- sys.getfilesystemencoding()- 返回檔案系統預設編碼。(2.3b1 中的新特性。)
- sys.exc_clear()- 清除當前異常(sys.exc_type 等)。(2.3b1 中的新特性。)
- sys.call_tracing()- 允許 pdb 遞迴除錯程式碼。(2.3b1 中的新特性。)
- gc.get_referents()- 返回一個物件直接引用的物件列表。(2.3b1 中的新特性。)
- dict.pop()- 現在接受一個可選引數,指定當鍵不在字典中時要返回的預設值。(2.3b1 中的新特性。)
- list.insert(i, x)現在將負數 i 解釋為切片會解釋的方式,因此負數值從列表末尾開始計數。(2.3b1 中的新特性。)從 2.3b2 開始,list.index() 現在接受可選的 start 和 end 引數。
- 不定義 __new__ 或 __init__ 的新式類不再忽略建構函式引數。(2.3a2 中的新特性。)
- 以減號開頭的字首的十六進位制/八進位制字面量處理方式不一致。這已根據 PEP 237 進行了修復。(2.3a2 中的新特性。)
- 函式現在也具有 __module__ 屬性。(2.3a2 中的新特性。)
- 將浮點數傳遞給需要整數的 C 函式現在會發出 DeprecationWarning;將來這會變成 TypeError。(2.3a2 中的新特性。)
- distutils 的包索引和元資料。這是對 Python 目錄的支援,現在在 cheeseshop.python.org/pypi 上開放使用。(PEP 301)
- 預設情況下啟用對生成器的支援 - 'yield' 始終是關鍵字,不再需要 'from __future__ import generators'(但仍然允許)。(PEP 255)
- 擴充套件切片- 標準序列型別(字串、列表等)現在支援擴充套件切片。巧妙的是:s[::-1] 反轉字串。
- None- 給名為 None 的變數或屬性賦值現在將觸發警告。將來,None 可能成為關鍵字。
- 新式類現在允許賦值給__name__和__bases__.
- 實習字串不再是不朽的。
- sys.setcheckinterval()- 此功能的預設值已從 10 更改為 100,以加快交錯多個執行緒的執行速度(透過減少執行緒切換頻率)。
- 通用換行符- 使用特殊模式 “U”(而不是 “r”)開啟讀取的檔案,會將所有三種常見的行尾約定(n、r、rn)轉換為 Python 的標準 n 約定。由 Jack Jansen 貢獻。(PEP 278)
- 編碼宣告- 你可以在 Python 原始檔的第一行或第二行中放置一個 “# -- coding: <encodingname> --” 形式的註釋,以指示編碼(例如 utf-8)。(PEP 263 第 1 階段)
- 編解碼器錯誤處理回撥- 這允許靈活地處理編碼錯誤。(PEP 293)
- 檔案物件現在是它們自己的迭代器。這使得在同一檔案上的多次中斷迭代更加可靠。xreadlines() 方法和模組現在已被棄用。
- Thein運算子現在可以用於子字串測試,例如 'ca' in 'abracadabra' 返回 True。
- 從 zip 檔案匯入- 放置在 sys.path(或 $PYTHONPATH)上的 zip 檔案的名稱會導致 import 在 zip 檔案中查詢模組和包。還提供了其他匯入鉤子。程式碼由 Just van Rossum 基於 James Ahlstrom 的想法編寫。(PEP 273 和 PEP 302。)
- 支援 Unicode 檔名的平臺(特別是 Windows 的 NT/2000/XP 系列)。(PEP 277)
- 一個新的警告,FutureWarning,對於某些看起來是無符號的但實際上是負數的十六進位制或八進位制常量的使用、可能丟失位或更改符號的左移,以及某些轉換為十六進位制或八進位制的情況發出。
- Tim Peters 重寫了他的list.sort()實現 - 這是一個“穩定排序”(相等的輸入在輸出中以相同的順序出現),並且比以前更快。
- Tim Peters 還更改了長整數乘法以使用 Karatsuba 演算法,該演算法基於 Christopher A. Craig 的補丁。這加快了非常長的整數的乘法速度。