Python 2.7 中的新功能¶
- 作者:
A.M. Kuchling (amk at amk.ca)
本文介紹了 Python 2.7 中的新功能。 Python 2.7 於 2010 年 7 月 3 日釋出。
數值處理在許多方面都得到了改進,包括浮點數和 Decimal
類。標準庫中添加了一些有用的功能,例如大大增強的 unittest
模組,用於解析命令列選項的 argparse
模組,OrderedDict
和 Counter
等方便的類(在 collections
模組中),以及許多其他改進。
Python 2.7 計劃成為 2.x 系列的最後一個版本,因此我們致力於使其成為一個長期的良好版本。 為了幫助移植到 Python 3,Python 3.x 系列中的一些新功能已包含在 2.7 中。
本文不打算提供新功能的完整規範,而是提供一個方便的概述。 有關完整詳細資訊,您應該參考 https://docs.python.club.tw 上的 Python 2.7 文件。 如果您想了解設計和實現的原理,請參考特定新功能的 PEP 或 https://bugs.python.org 上討論更改的問題。 如果可能,“Python 中的新功能”會連結到每次更改的錯誤/補丁項。
Python 2.x 的未來¶
Python 2.7 是 2.x 系列中的最後一個主要版本,因為 Python 維護人員已將新功能開發工作的重點轉移到 Python 3.x 系列。 這意味著,雖然 Python 2 繼續接收錯誤修復,並更新為在新硬體和受支援的作業系統的版本上正確構建,但該語言或標準庫將不會有新的完整功能版本。
但是,雖然 Python 2.7 和 Python 3 之間存在大量的公共子集,並且遷移到該公共子集或直接遷移到 Python 3 所涉及的許多更改可以安全地自動執行,但其他一些更改(特別是那些與 Unicode 處理相關的更改)可能需要仔細考慮,並且最好是穩健的自動化迴歸測試套件,以便有效地進行遷移。
這意味著 Python 2.7 將在很長一段時間內保持不變,為尚未移植到 Python 3 的生產系統提供穩定且受支援的基礎平臺。 Python 2.7 系列的完整預期生命週期在 PEP 373 中詳細說明。
2.7 長期意義的一些關鍵後果是
如上所述,與早期的 2.x 版本相比,2.7 版本的維護期要長得多。 Python 2.7 目前預計將繼續得到核心開發團隊的支援(接收安全更新和其他錯誤修復),直到至少 2020 年(在其首次釋出 10 年後,而通常的支援期為 18-24 個月)。
隨著 Python 2.7 標準庫的老化,有效地使用 Python 包索引(直接或透過重新分發商)對於 Python 2 使用者變得越來越重要。 除了用於各種任務的各種第三方軟體包外,可用的軟體包還包括與 Python 2 相容的 Python 3 標準庫中新模組和功能的向後移植,以及各種可以更容易遷移到 Python 3 的工具和庫。 Python 打包使用者指南提供了有關從 Python 包索引下載和安裝軟體的指導。
雖然增強 Python 2 的首選方法現在是在 Python 包索引上釋出新軟體包,但這種方法並非在所有情況下都有效,特別是與網路安全相關的那些情況。 在無法透過在 PyPI 上釋出新的或更新的軟體包來充分處理的特殊情況下,可以使用 Python 增強提案流程來論證將新功能直接新增到 Python 2 標準庫中。 任何此類新增以及新增這些新增的維護版本都將在下面的 新增到 Python 2.7 維護版本的新功能 部分中註明。
對於希望從 Python 2 遷移到 Python 3 的專案,或者對於希望支援 Python 2 和 Python 3 使用者的庫和框架開發人員,有各種工具和指南可幫助決定合適的方法並管理所涉及的一些技術細節。 建議的起點是 如何將 Python 2 程式碼移植到 Python 3 HOWTO 指南。
棄用警告的處理更改¶
對於 Python 2.7,做出了一個策略決定,預設情況下僅抑制對開發人員感興趣的警告。 除非另有要求,否則現在會忽略 DeprecationWarning
及其後代,從而防止使用者看到由應用程式觸發的警告。 此更改也在成為 Python 3.2 的分支中進行。(在 stdlib-sig 上討論並在 bpo-7319 中執行。)
在之前的版本中,預設啟用 DeprecationWarning
訊息,為 Python 開發人員提供了一個明確的指示,說明他們的程式碼在未來的 Python 主要版本中可能會在哪裡中斷。
但是,越來越多的 Python 應用程式使用者沒有直接參與這些應用程式的開發。 DeprecationWarning
訊息與此類使用者無關,這使得他們擔心實際上工作正常的應用程式,並給應用程式開發人員帶來了回應這些擔憂的負擔。
您可以透過使用 -Wdefault
(簡寫形式:-Wd
)開關執行 Python,或者在執行 Python 之前將 PYTHONWARNINGS
環境變數設定為 "default"
(或 "d"
)來重新啟用 DeprecationWarning
訊息的顯示。 Python 程式碼也可以透過呼叫 warnings.simplefilter('default')
來重新啟用它們。
執行測試時,unittest
模組也會自動重新啟用棄用警告。
Python 3.1 的功能¶
就像 Python 2.6 整合了 Python 3.0 的功能一樣,2.7 版本也整合了 Python 3.1 中的一些新功能。 2.x 系列繼續提供用於遷移到 3.x 系列的工具。
向後移植到 2.7 的 3.1 功能的部分列表
集合字面量的語法(
{1,2,3}
是一個可變集合)。字典和集合推導式(
{i: i*2 for i in range(3)}
)。單個
with
語句中的多個上下文管理器。新版本的
io
庫,用 C 重寫以提高效能。PEP 372:向 collections 新增有序字典 中描述的有序字典型別。
PEP 378:千位分隔符的格式說明符 中描述的新
","
格式說明符。memoryview
物件。浮點數
x
的repr()
在許多情況下會更短:它現在基於保證能四捨五入回x
的最短十進位制字串。與之前的 Python 版本一樣,可以保證float(repr(x))
可以恢復x
。浮點數到字串以及字串到浮點數的轉換已正確舍入。
round()
函式現在也已正確舍入。PyCapsule
型別,用於為擴充套件模組提供 C API。PyLong_AsLongAndOverflow()
C API 函式。
其他新的 Python3 模式警告包括:
operator.isCallable()
和operator.sequenceIncludes()
在 3.x 中不支援,現在會觸發警告。-3
開關現在會自動啟用-Qwarn
開關,該開關會導致在使用整數和長整數進行經典除法時發出警告。
PEP 372:向 collections 新增有序字典¶
常規 Python 字典以任意順序迭代鍵/值對。多年來,許多作者編寫了替代實現,它們會記住鍵最初插入的順序。基於這些實現的經驗,2.7 在 collections
模組中引入了一個新的 OrderedDict
類。
OrderedDict
API 提供了與常規字典相同的介面,但根據首次插入鍵的時間,以保證的順序迭代鍵和值。
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
如果新條目覆蓋了現有條目,則原始插入位置保持不變。
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
刪除條目並重新插入會將其移動到末尾。
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
popitem()
方法有一個可選的 *last* 引數,預設為 True
。如果 *last* 為 true,則返回並刪除最近新增的鍵;如果為 false,則選擇最舊的鍵。
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
比較兩個有序字典會檢查鍵和值,並要求插入順序相同。
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
將 OrderedDict
與常規字典進行比較時,會忽略插入順序,只比較鍵和值。
OrderedDict
是如何工作的?它維護一個鍵的雙向連結串列,將新鍵附加到列表中。輔助字典將鍵對映到它們相應的列表節點,因此刪除不必遍歷整個連結串列,因此保持 O(1)。
標準庫現在支援在多個模組中使用有序字典。
ConfigParser
模組預設使用它們,這意味著現在可以以原始順序讀取、修改然後寫回配置檔案。_asdict()
方法適用於collections.namedtuple()
,現在返回一個有序字典,其中的值以與底層元組索引相同的順序顯示。json
模組的JSONDecoder
類建構函式擴充套件了一個 *object_pairs_hook* 引數,以允許解碼器構建OrderedDict
例項。還添加了對 PyYAML 等第三方工具的支援。
另請參閱
- PEP 372 - 向 collections 新增有序字典
由 Armin Ronacher 和 Raymond Hettinger 撰寫 PEP;由 Raymond Hettinger 實現。
PEP 378:千位分隔符的格式說明符¶
為了使程式輸出更具可讀性,可以向大數字新增分隔符,將其呈現為 18,446,744,073,709,551,616 而不是 18446744073709551616。
執行此操作的完全通用解決方案是 locale
模組,它可以使用不同的分隔符(北美使用“,”,歐洲使用“.”)和不同的分組大小,但 locale
使用起來很複雜,並且不適合多執行緒應用程式,在這些應用程式中,不同的執行緒為不同的語言環境生成輸出。
因此,已在 str.format()
方法使用的迷你語言中添加了一個簡單的逗號分組機制。格式化浮點數時,只需在寬度和精度之間包含一個逗號
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
格式化整數時,在寬度後包含逗號
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
此機制根本不具有適應性;逗號始終用作分隔符,分組始終分為三位陣列。逗號格式化機制不如 locale
模組通用,但它更容易使用。
另請參閱
- PEP 378 - 千位分隔符的格式說明符
由 Raymond Hettinger 撰寫 PEP;由 Eric Smith 實現。
PEP 389:用於解析命令列的 argparse 模組¶
添加了用於解析命令列引數的 argparse
模組,以更強大地替代 optparse
模組。
這意味著 Python 現在支援三個不同的模組來解析命令列引數:getopt
、 optparse
和 argparse
。 getopt
模組與 C 庫的 getopt()
函式非常相似,因此如果您正在編寫最終將用 C 重寫的 Python 原型,它仍然很有用。optparse
變得冗餘,但沒有計劃刪除它,因為仍然有很多指令碼正在使用它,並且沒有自動更新這些指令碼的方法。(討論過使 argparse
API 與 optparse
的介面一致,但由於過於混亂和困難而被拒絕。)
簡而言之,如果您正在編寫一個新指令碼並且無需擔心與早期版本的 Python 的相容性,請使用 argparse
而不是 optparse
。
這是一個例子
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
除非您覆蓋它,否則會自動新增 -h
和 --help
開關,並生成格式整齊的輸出
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
與 optparse
一樣,命令列開關和引數會作為物件返回,物件的屬性由 dest 引數命名
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse
比 optparse
擁有更強大的驗證功能;你可以指定一個精確的引數數量(使用整數),使用 '*'
表示 0 個或多個引數,使用 '+'
表示 1 個或多個引數,或使用 '?'
表示一個可選引數。頂層解析器可以包含子解析器,用於定義具有不同開關的子命令,例如 svn commit
、svn checkout
等。你可以將引數的型別指定為 FileType
,它會自動為你開啟檔案,並且知道 '-'
表示標準輸入或輸出。
另請參閱
argparse
文件argparse 模組的文件頁面。
- 將 optparse 程式碼遷移到 argparse
Python 文件的一部分,描述瞭如何轉換使用
optparse
的程式碼。- PEP 389 - argparse - 新的命令列解析模組
由 Steven Bethard 編寫和實現的 PEP。
PEP 391:基於字典的日誌配置¶
logging
模組非常靈活;應用程式可以定義一個日誌子系統的樹形結構,並且此樹中的每個記錄器都可以過濾掉某些訊息,以不同的方式格式化它們,並將訊息定向到不同數量的處理程式。
所有這些靈活性可能需要大量的配置。你可以編寫 Python 語句來建立物件並設定它們的屬性,但是複雜的設定需要冗長而枯燥的程式碼。logging
還支援 fileConfig()
函式來解析檔案,但是檔案格式不支援配置過濾器,並且以程式設計方式生成它更加混亂。
Python 2.7 添加了一個 dictConfig()
函式,該函式使用字典來配置日誌。有很多方法可以從不同的來源生成字典:使用程式碼構造一個;解析包含 JSON 的檔案;如果安裝了 YAML 解析庫,則使用它。有關更多資訊,請參見 配置函式。
以下示例配置了兩個記錄器,根記錄器和一個名為“network”的記錄器。傳送到根記錄器的訊息將使用 syslog 協議傳送到系統日誌,而傳送到“network”記錄器的訊息將寫入 network.log
檔案,該檔案將在日誌達到 1MB 時進行輪換。
import logging
import logging.config
configdict = {
'version': 1, # Configuration schema in use; must be 1 for now
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Specify all the subordinate loggers
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Specify properties of the root logger
'root': {
'handlers': ['syslog']
},
}
# Set up configuration
logging.config.dictConfig(configdict)
# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
對 logging
模組進行了三個較小的增強,均由 Vinay Sajip 實現,它們是
SysLogHandler
類現在支援透過 TCP 進行 syslog 記錄。建構函式有一個 socktype 引數,用於指定要使用的套接字型別,可以使用socket.SOCK_DGRAM
表示 UDP 或使用socket.SOCK_STREAM
表示 TCP。預設協議仍然是 UDP。Logger
例項獲得了一個getChild()
方法,該方法使用相對路徑檢索後代記錄器。例如,一旦你透過執行log = getLogger('app')
檢索到記錄器,呼叫log.getChild('network.listen')
等效於getLogger('app.network.listen')
。LoggerAdapter
類獲得了一個isEnabledFor()
方法,該方法接受一個 level 引數,並返回底層記錄器是否會處理該重要級別的訊息。
另請參閱
- PEP 391 - 基於字典的日誌配置
由 Vinay Sajip 編寫和實現的 PEP。
PEP 3106:字典檢視¶
字典方法 keys()
、values()
和 items()
在 Python 3.x 中有所不同。它們返回一個名為檢視的物件,而不是完全物化的列表。
在 Python 2.7 中,不可能更改 keys()
、values()
和 items()
的返回值,因為太多程式碼會因此中斷。相反,3.x 版本以新名稱 viewkeys()
、viewvalues()
和 viewitems()
新增。
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
檢視可以迭代,但鍵和項檢視的行為也類似於集合。&
運算子執行交集,|
執行並集。
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
檢視跟蹤字典,並且其內容會隨著字典的修改而更改。
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
但是,請注意,在迭代檢視時,你不能新增或刪除鍵。
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
你可以在 Python 2.x 程式碼中使用檢視方法,並且 2to3 轉換器會將它們更改為標準的 keys()
、values()
和 items()
方法。
PEP 3137:memoryview 物件¶
memoryview
物件提供了另一個物件的記憶體內容的檢視,該檢視與 bytes
型別的介面匹配。
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Returns length of underlying object
52
>>> m[0], m[25], m[26] # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
檢視的內容可以轉換為位元組字串或整數列表。
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
如果底層物件是可變物件,則 memoryview
物件允許修改它。
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Assign to view, changing the bytearray.
>>> b[0:5] # The bytearray has been changed.
bytearray(b'*bcde')
>>>
其他語言更改¶
對核心 Python 語言進行的一些較小更改是
集合字面量的語法已從 Python 3.x 反向移植。花括號用於包圍生成的可以修改的集合的內容;集合字面量透過不包含冒號和值來與字典區分。
{}
繼續表示一個空字典;使用set()
表示一個空集合。>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
由 Alexandre Vassalotti 向後移植;bpo-2335。
字典和集合推導式是另一個從 3.x 向後移植的功能,它將列表/生成器推導式推廣到使用集合和字典的字面語法。
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
由 Alexandre Vassalotti 向後移植;bpo-2333。
with
語句現在可以在一個語句中使用多個上下文管理器。上下文管理器從左到右處理,每個都被視為開始一個新的with
語句。這意味著with A() as a, B() as b: ... suite of statements ...
等價於
with A() as a: with B() as b: ... suite of statements ...
contextlib.nested()
函式提供了非常相似的功能,因此不再需要,並且已被棄用。(在 https://codereview.appspot.com/53094 中提出;由 Georg Brandl 實現。)
浮點數和字串之間的轉換現在在大多數平臺上都進行了正確的舍入。這些轉換髮生在許多不同的地方:
str()
用於浮點數和複數;float
和complex
建構函式;數值格式化;使用marshal
、pickle
和json
模組序列化和反序列化浮點數和複數;解析 Python 程式碼中的浮點數和虛數字面量;以及Decimal
到浮點數的轉換。與此相關,浮點數 *x* 的
repr()
現在返回基於最短十進位制字串的結果,該字串保證在正確的舍入(使用四捨五入到偶數的舍入模式)下舍入回 *x*。 以前它給出了一個基於將 x 舍入到 17 位小數的字串。負責此改進的舍入庫在 Windows 和使用 gcc、icc 或 suncc 編譯器的 Unix 平臺上工作。可能存在少數無法保證此程式碼正確執行的平臺,因此該程式碼未在這些系統上使用。您可以透過檢查
sys.float_repr_style
來了解正在使用哪個程式碼,如果正在使用新程式碼,則該值將為short
,如果未使用,則為legacy
。由 Eric Smith 和 Mark Dickinson 使用 David Gay 的
dtoa.c
庫實現;bpo-7117。從長整型和常規整型到浮點數的轉換現在以不同的方式舍入,返回最接近該數字的浮點數。對於可以精確轉換的小整數來說,這並不重要,但對於不可避免地會損失精度的大數字,Python 2.7 現在更接近地近似。 例如,Python 2.6 計算了以下內容
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Python 2.7 的浮點數結果更大,但更接近真實值
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(由 Mark Dickinson 實現;bpo-3166。)
整數除法在其舍入行為中也更準確。(也由 Mark Dickinson 實現;bpo-1811。)
複數的隱式強制型別轉換已被刪除;直譯器將不再嘗試在複數物件上呼叫
__coerce__()
方法。(由 Meador Inge 和 Mark Dickinson 刪除;bpo-5211。)str.format()
方法現在支援替換欄位的自動編號。這使得使用str.format()
更像使用%s
格式化>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
自動編號從左到右獲取欄位,因此第一個
{...}
說明符將使用str.format()
的第一個引數,下一個說明符將使用下一個引數,依此類推。您不能混合使用自動編號和顯式編號 - 要麼對所有說明符欄位進行編號,要麼都不進行編號 - 但您可以混合使用自動編號和命名欄位,如上面的第二個示例所示。(由 Eric Smith 貢獻;bpo-5237。)複數現在正確地支援與
format()
一起使用,並且預設右對齊。指定精度或逗號分隔符適用於數字的實部和虛部,但指定的欄位寬度和對齊方式適用於整個結果1.5+3j
輸出。(由 Eric Smith 貢獻;bpo-1588 和 bpo-7988。)“F”格式程式碼現在始終使用大寫字元格式化其輸出,因此現在將生成“INF”和“NAN”。(由 Eric Smith 貢獻;bpo-3382。)
一個低階更改:如果向
object.__format__()
方法傳遞格式字串,則該方法現在會觸發PendingDeprecationWarning
,因為object
的__format__()
方法將物件轉換為字串表示形式並格式化該字串。以前,該方法會默默地將格式字串應用於字串表示形式,但這可能會隱藏 Python 程式碼中的錯誤。 如果您提供諸如對齊或精度之類的格式化資訊,則可能希望以某種特定於物件的方式應用格式化。(由 Eric Smith 修復;bpo-7994。)int()
和long()
型別獲得了一個bit_length
方法,該方法返回以二進位制表示其引數所需的位數>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(由 Fredrik Johansson 和 Victor Stinner 貢獻;bpo-3439。)
如果相對匯入(例如
from .os import sep
)失敗,import
語句將不再嘗試絕對匯入。這修復了一個錯誤,但可能會破壞某些只是偶然起作用的import
語句。(由 Meador Inge 修復;bpo-7902。)現在,內建
unicode
型別的子類可以重寫__unicode__()
方法。(由 Victor Stinner 實現;bpo-1583863。)bytearray
型別的translate()
方法現在接受None
作為其第一個引數。(由 Georg Brandl 修復;bpo-4759。)當使用
@classmethod
和@staticmethod
將方法包裝為類方法或靜態方法時,包裝器物件現在將其包裝的函式公開為它們的__func__
屬性。(由 Amaury Forgeot d’Arc 貢獻,在 George Sakkis 的建議之後;bpo-5982。)當使用
__slots__
設定了受限的屬性集時,刪除未設定的屬性不會像預期那樣引發AttributeError
。由 Benjamin Peterson 修復;bpo-7604。)現在支援兩種新的編碼:“cp720”,主要用於阿拉伯文字;以及“cp858”,它是 CP 850 的變體,添加了歐元符號。(CP720 由 Alexander Belchenko 和 Amaury Forgeot d’Arc 在 bpo-1616979 中貢獻;CP858 由 Tim Hatch 在 bpo-8016 中貢獻。)
現在,當嘗試在 POSIX 平臺上開啟目錄時,
file
物件將在IOError
異常上設定filename
屬性(由 Jan Kaliszewski 指出;bpo-4764),並且現在顯式檢查並禁止寫入只讀檔案物件,而不是信任 C 庫來捕獲和報告錯誤(由 Stefan Krah 修復;bpo-5677)。Python 詞法分析器現在自行轉換行尾符,因此
compile()
內建函式現在接受使用任何行尾約定的程式碼。此外,它不再要求程式碼以換行符結尾。函式定義中的額外括號在 Python 3.x 中是非法的,這意味著你會從
def f((x)): pass
中得到一個語法錯誤。在 Python3 警告模式下,Python 2.7 現在將警告這種奇怪的用法。(由 James Lingard 指出;bpo-7362。)現在可以建立對舊式類物件的弱引用。新式類始終是可弱引用的。(由 Antoine Pitrou 修復;bpo-8268。)
當模組物件被垃圾回收時,如果其他人沒有持有對該模組字典的引用,則現在才清除該模組的字典(bpo-7140)。
直譯器變更¶
一個新的環境變數,PYTHONWARNINGS
,允許控制警告。它應該被設定為包含警告設定的字串,等同於與 -W
開關一起使用的警告設定,用逗號分隔。(由 Brian Curtin 貢獻;bpo-7301。)
例如,以下設定將在每次發生警告時列印警告,但將 Cookie
模組中的警告轉換為錯誤。(設定環境變數的確切語法因作業系統和 shell 而異。)
export PYTHONWARNINGS=all,error:::Cookie:0
最佳化¶
添加了幾項效能增強
添加了一個新的操作碼,用於執行
with
語句的初始設定,查詢__enter__()
和__exit__()
方法。(由 Benjamin Peterson 貢獻。)垃圾收集器現在對於一種常見的用法模式表現更好:當分配了許多物件而沒有釋放任何物件時。以前,這需要二次時間進行垃圾回收,但現在,隨著堆上物件數量的增長,完全垃圾回收的次數減少了。只有當中間代被收集 10 次並且中間代的倖存物件數量超過最老一代物件數量的 10% 時,新邏輯才會執行完全垃圾回收過程。(由 Martin von Löwis 提出建議,並由 Antoine Pitrou 實現;bpo-4074。)
垃圾收集器會盡量避免跟蹤不能成為迴圈一部分的簡單容器。在 Python 2.7 中,現在對於包含原子型別(例如整數、字串等)的元組和字典來說是這樣的。傳遞地,包含原子型別元組的字典也不會被跟蹤。這有助於減少每次垃圾回收的成本,因為減少了收集器需要考慮和遍歷的物件數量。(由 Antoine Pitrou 貢獻;bpo-4688。)
長整數現在在內部儲存為基數
2**15
或基數2**30
,基數在構建時確定。以前,它們總是以基數2**15
儲存。在 64 位機器上使用基數2**30
可以顯著提高效能,但在 32 位機器上的基準測試結果好壞參半。因此,預設是在 64 位機器上使用基數2**30
,在 32 位機器上使用基數2**15
;在 Unix 上,有一個新的配置選項--enable-big-digits
,可用於覆蓋此預設值。除了效能改進外,此更改對於終端使用者應該是不可見的,但有一個例外:出於測試和除錯目的,有一個新的 structseq
sys.long_info
,它提供有關內部格式的資訊,給出每個數字的位數和用於儲存每個數字的 C 型別的大小(以位元組為單位)。>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(由 Mark Dickinson 貢獻;bpo-4258。)
另一組更改使長物件小了幾字節:在 32 位系統上小 2 位元組,在 64 位系統上小 6 位元組。(由 Mark Dickinson 貢獻;bpo-5260。)
透過收緊內迴圈,進行移位而不是乘法,並修復一個不必要的額外迭代,長整數的除法演算法變得更快了。各種基準測試顯示,長整數除法和模運算的速度提高了 50% 到 150% 之間。(由 Mark Dickinson 貢獻;bpo-5512。)按位運算也明顯更快(最初由 Gregory Smith 提供補丁;bpo-1087418)。
%
的實現檢查左側運算元是否為 Python 字串,並對其進行特殊處理;這使得頻繁使用帶有字串的%
的應用程式(例如模板庫)的效能提高了 1-3%。(由 Collin Winter 實現;bpo-5176。)帶有
if
條件的列表推導式被編譯為更快的位元組碼。(由 Antoine Pitrou 提供補丁,由 Jeffrey Yasskin 反向移植到 2.7;bpo-4715。)透過特殊處理基數 10 而不是使用支援任意基數的通用轉換函式,將整數或長整數轉換為十進位制字串的速度加快了。(由 Gawain Bolton 提供補丁;bpo-6713。)
類字串型別(字串、Unicode 字串和
bytearray
物件)的split()
、replace()
、rindex()
、rpartition()
和rsplit()
方法現在使用快速反向搜尋演算法,而不是逐字元掃描。這有時會快 10 倍。(由 Florent Xicluna 新增;bpo-7462 和 bpo-7622。)pickle
和cPickle
模組現在會自動實習用於屬性名稱的字串,從而減少了取消醃製產生的物件的記憶體使用量。(由 Jake McGuire 貢獻;bpo-5084。)cPickle
模組現在特殊處理字典,幾乎將醃製它們所需的時間減半。(由 Collin Winter 貢獻;bpo-5670。)
新的和改進的模組¶
與每個版本一樣,Python 的標準庫收到了許多增強功能和錯誤修復。以下是按模組名稱字母順序排列的最顯著更改的部分列表。有關更完整的更改列表,請查閱原始碼樹中的 Misc/NEWS
檔案,或瀏覽 Subversion 日誌以獲取所有詳細資訊。
bdb
模組的基礎除錯類Bdb
獲得了一個跳過模組的功能。現在,建構函式接受一個包含 glob 樣式模式(例如django.*
)的可迭代物件;偵錯程式將不會進入與這些模式之一匹配的模組中的堆疊幀。(由 Maru Newby 在 Senthil Kumaran 的建議後貢獻;bpo-5142。)現在,
binascii
模組支援緩衝區 API,因此它可以與memoryview
例項和其他類似的緩衝區物件一起使用。(由 Florent Xicluna 從 3.x 版本移植;bpo-7703.)已更新的模組:
bsddb
模組已從 4.7.2devel9 更新到 pybsddb 包的 4.8.4 版本。新版本具有更好的 Python 3.x 相容性,修復了各種錯誤,並添加了幾個新的 BerkeleyDB 標誌和方法。(由 Jesús Cea Avión 更新;bpo-8156。pybsddb 的更新日誌可以在 https://hg.jcea.es/pybsddb/file/tip/ChangeLog 中閱讀。)bz2
模組的BZ2File
現在支援上下文管理協議,因此您可以編寫with bz2.BZ2File(...) as f:
。(由 Hagen Fürstenau 貢獻;bpo-3860.)新類:
collections
模組中的Counter
類對於統計資料非常有用。Counter
例項的行為主要類似於字典,但對於丟失的鍵,它返回零而不是引發KeyError
。>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
有三個額外的
Counter
方法。most_common()
返回 N 個最常見的元素及其計數。elements()
返回一個迭代器,遍歷包含的元素,每個元素重複其計數值的次數。subtract()
接受一個可迭代物件,併為每個元素減一而不是加一;如果引數是一個字典或另一個Counter
,則會減去計數。>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Count is now lower -1
由 Raymond Hettinger 貢獻;bpo-1696199。
新類:
OrderedDict
在前面的 PEP 372:向 collections 新增有序字典 部分中進行了描述。新方法:
deque
資料型別現在有一個count()
方法,該方法返回包含的元素中等於提供的引數 *x* 的數量,以及一個reverse()
方法,該方法就地反轉 deque 的元素。deque
還將其最大長度公開為只讀maxlen
屬性。(兩個功能均由 Raymond Hettinger 新增。)namedtuple
類現在有一個可選的 *rename* 引數。如果 *rename* 為 true,則由於重複或不是合法的 Python 識別符號而無效的欄位名稱將被重新命名為從欄位在欄位列表中的位置派生的合法名稱。>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(由 Raymond Hettinger 新增;bpo-1818.)
最後,如果將對映與不是
Mapping
的另一種型別進行比較,則Mapping
抽象基類現在返回NotImplemented
。(由 Daniel Stutzbach 修復;bpo-8729。)現在,
ConfigParser
模組中解析類的建構函式接受一個 *allow_no_value* 引數,預設為 false;如果為 true,則允許沒有值的選項。例如>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(由 Mats Kindahl 貢獻;bpo-7005.)
已棄用的函式:
contextlib.nested()
,它允許使用單個with
語句處理多個上下文管理器,已被棄用,因為with
語句現在支援多個上下文管理器。現在,
cookielib
模組會忽略具有無效版本欄位(不包含整數值的欄位)的 cookie。(由 John J. Lee 修復;bpo-3924.)現在,
copy
模組的deepcopy()
函式將正確複製繫結的例項方法。(由 Robert Collins 實現;bpo-1515.)現在,對於宣告為指標的引數,
ctypes
模組始終將None
轉換為 CNULL
指標。(由 Thomas Heller 更改;bpo-4606.) 底層的 libffi 庫已更新到 3.0.9 版本,其中包含針對不同平臺的各種修復。(由 Matthias Klose 更新;bpo-8142.)新方法:
datetime
模組的timedelta
類獲得了一個total_seconds()
方法,該方法返回持續時間中的秒數。(由 Brian Quinlan 貢獻;bpo-5788.)新方法:
Decimal
類獲得了一個from_float()
類方法,該方法將浮點數精確轉換為Decimal
。此精確轉換力求獲得最接近浮點數表示值的十進位制近似值;因此,如果存在任何不準確之處,則生成的十進位制值仍將包含該不準確之處。例如,Decimal.from_float(0.1)
返回Decimal('0.1000000000000000055511151231257827021181583404541015625')
。(由 Raymond Hettinger 實現;bpo-4796.)現在,將
Decimal
的例項與浮點數進行比較會基於運算元的數值產生合理的結果。以前,此類比較會退回到 Python 比較物件的預設規則,該規則會根據它們的型別產生任意的結果。請注意,您仍然不能在加法等其他操作中組合Decimal
和浮點數,因為您應該顯式地選擇如何在浮點數和Decimal
之間進行轉換。(由 Mark Dickinson 修復;bpo-2531。)Decimal
的建構函式現在接受浮點數(由 Raymond Hettinger 新增;bpo-8257)和非歐洲 Unicode 字元,例如阿拉伯-印度數字(由 Mark Dickinson 貢獻;bpo-6595)。Context
類的大多數方法現在接受整數以及Decimal
例項;唯一的例外是canonical()
和is_canonical()
方法。(Juan José Conti 的補丁;bpo-7633。)當使用
Decimal
例項與字串的format()
方法時,預設對齊方式以前是左對齊。這已更改為右對齊,對於數值型別來說更合理。(由 Mark Dickinson 更改;bpo-6857。)涉及訊號 NaN 值(或
sNAN
)的比較現在會發出InvalidOperation
訊號,而不是根據比較運算子靜默地返回 true 或 false 值。現在,安靜的 NaN 值(或NaN
)是可雜湊的。(由 Mark Dickinson 修復;bpo-7279。)difflib
模組現在透過一個小的更改,在給出檔名的標頭中使用製表符而不是空格作為分隔符,從而產生與現代 diff/patch 工具更相容的輸出。(由 Anatoly Techtonik 修復;bpo-7585。)Distutils
sdist
命令現在始終重新生成MANIFEST
檔案,因為即使MANIFEST.in
或setup.py
檔案沒有被修改,使用者也可能建立了一些應該包含的新檔案。(由 Tarek Ziadé 修復;bpo-8688。)doctest
模組的IGNORE_EXCEPTION_DETAIL
標誌現在將忽略包含正在測試的異常的模組名稱。(Lennart Regebro 的補丁;bpo-7490。)email
模組的Message
類現在將接受 Unicode 值的有效負載,自動將有效負載轉換為output_charset
指定的編碼。(由 R. David Murray 新增;bpo-1368247。)Fraction
類現在接受單個浮點數或Decimal
例項,或兩個有理數,作為其建構函式的引數。(由 Mark Dickinson 實現;有理數在 bpo-5812 中新增,浮點數/十進位制數在 bpo-8294 中新增。)分數和複數之間的排序比較(
<
、<=
、>
、>=
)現在會引發TypeError
。這修復了一個疏忽,使Fraction
與其他數值型別匹配。新類:
FTP_TLS
在ftplib
模組中提供了安全的 FTP 連線,使用 TLS 封裝身份驗證以及後續的控制和資料傳輸。(由 Giampaolo Rodola 貢獻;bpo-2054。)用於二進位制上傳的
storbinary()
方法現在可以透過新增的 rest 引數來重新啟動上傳(Pablo Mouzo 的補丁;bpo-6845。)新的類裝飾器:
total_ordering()
在functools
模組中,接受一個定義了__eq__()
方法和__lt__()
、__le__()
、__gt__()
或__ge__()
之一的類,並生成缺少的比較方法。由於__cmp__()
方法在 Python 3.x 中被棄用,此裝飾器使定義有序類更加容易。(由 Raymond Hettinger 新增;bpo-5479。)新函式:
cmp_to_key()
將接受一個期望兩個引數的舊式比較函式,並返回一個新的可呼叫物件,該物件可用作sorted()
、min()
和max()
等函式的 key 引數。 主要用途是幫助使程式碼與 Python 3.x 相容。(由 Raymond Hettinger 新增。)新函式:
gc
模組的is_tracked()
函式返回給定例項是否由垃圾收集器跟蹤,否則返回 false。(由 Antoine Pitrou 貢獻;bpo-4688。)gzip
模組的GzipFile
現在支援上下文管理協議,因此您可以編寫with gzip.GzipFile(...) as f:
(由 Hagen Fürstenau 貢獻;bpo-3860),並且它現在實現了io.BufferedIOBase
ABC,因此您可以使用io.BufferedReader
對其進行包裝以進行更快的處理(由 Nir Aides 貢獻;bpo-7471)。現在還可以透過向建構函式提供可選的時間戳來覆蓋 gzipped 檔案中記錄的修改時間。(由 Jacques Frechet 貢獻;bpo-4272。)gzip 格式的檔案可以使用尾部零位元組進行填充;
gzip
模組現在會消耗這些尾部位元組。(由 Tadek Pietraszek 和 Brian Curtin 修復;bpo-2846。)新屬性:
hashlib
模組現在有一個algorithms
屬性,其中包含一個元組,該元組命名了支援的演算法。在 Python 2.7 中,hashlib.algorithms
包含('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
。(由 Carl Chenet 貢獻;bpo-7418。)httplib
模組使用的預設HTTPResponse
類現在支援緩衝,從而可以更快地讀取 HTTP 響應。(由 Kristján Valur Jónsson 貢獻;bpo-4879。)HTTPConnection
和HTTPSConnection
類現在支援 source_address 引數,這是一個(host, port)
二元組,用於指定連線將使用的源地址。(由 Eldon Ziegler 貢獻;bpo-3972。)ihooks
模組現在支援相對匯入。請注意,ihooks
是一個用於自定義匯入的較舊模組,已被 Python 2.0 中新增的imputil
模組取代。(相對匯入支援由 Neil Schemenauer 新增。)新函式:
inspect
模組的getcallargs()
函式接受一個可呼叫物件及其位置引數和關鍵字引數,並找出可呼叫物件的哪些引數將接收每個引數,返回一個將引數名稱對映到其值的字典。例如>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass ... >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
由 George Sakkis 貢獻;bpo-3135。
更新的模組:
io
庫已升級到 Python 3.1 隨附的版本。對於 3.1,I/O 庫完全用 C 語言重寫,其速度根據所執行的任務提高了 2 到 20 倍。原始的 Python 版本已重新命名為_pyio
模組。一個小的相關更改:
io.TextIOBase
類現在有一個errors
屬性,該屬性給出了用於編碼和解碼錯誤的錯誤設定('strict'
、'replace'
、'ignore'
中的一個)。現在,當傳遞無效的檔案描述符時,
io.FileIO
類會引發OSError
。(由 Benjamin Peterson 實現;bpo-4991。)truncate()
方法現在會保留檔案位置;以前,它會將檔案位置更改為新檔案的末尾。(由 Pascal Chambon 修復;bpo-6939。)新函式:
itertools.compress(data, selectors)
接受兩個迭代器。如果 selectors 中的相應值為 true,則返回 data 的元素itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
新函式:
itertools.combinations_with_replacement(iter, r)
返回可迭代物件 iter 中元素的所有可能的長度為 r 的組合。與combinations()
不同,可以在生成的組合中重複單個元素itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
請注意,元素根據它們在輸入中的位置而不是它們的實際值被視為唯一的。
itertools.count()
函式現在具有一個 step 引數,該引數允許按 1 以外的值遞增。count()
現在也允許關鍵字引數,並且可以使用非整數值,例如浮點數或Decimal
例項。(由 Raymond Hettinger 實現;bpo-5032。)對於大於輸入可迭代物件的 r 值,
itertools.combinations()
和itertools.product()
以前會引發ValueError
。這被認為是規範錯誤,因此它們現在返回一個空迭代器。(由 Raymond Hettinger 修復;bpo-4816。)更新的模組:
json
模組已升級到 simplejson 包的 2.0.9 版本,其中包括一個 C 擴充套件,可加快編碼和解碼速度。(由 Bob Ippolito 貢獻;bpo-4136。)為了支援新的
collections.OrderedDict
型別,json.load()
現在有一個可選的 object_pairs_hook 引數,該引數將在任何解碼為成對列表的物件文字時被呼叫。(由 Raymond Hettinger 貢獻;bpo-5381。)mailbox
模組的Maildir
類現在會記錄它讀取的目錄的時間戳,並且僅當修改時間隨後發生更改時才會重新讀取它們。這透過避免不必要的目錄掃描來提高效能。(由 A.M. Kuchling 和 Antoine Pitrou 修復;bpo-1607951,bpo-6896。)新函式:
math
模組獲得了用於誤差函式和互補誤差函式的erf()
和erfc()
,計算e**x - 1
的expm1()
比使用exp()
並減去 1 具有更高的精度,用於 Gamma 函式的gamma()
,以及用於 Gamma 函式自然對數的lgamma()
。(由 Mark Dickinson 和 nirinA raseliarison 貢獻;bpo-3366。)multiprocessing
模組的Manager*
類現在可以傳遞一個可呼叫物件,該物件將在每次啟動子程序時被呼叫,以及一組將傳遞給可呼叫物件的引數。(由 lekma 貢獻;bpo-5585。)控制工作程序池的
Pool
類現在有一個可選的 maxtasksperchild 引數。工作程序將執行指定數量的任務,然後退出,從而使Pool
啟動新的工作程序。如果任務可能會洩漏記憶體或其他資源,或者某些任務會導致工作程序變得非常大,則此功能很有用。(由 Charles Cazabon 貢獻;bpo-6963。)現在
nntplib
模組支援 IPv6 地址。(由 Derek Morr 貢獻;bpo-1664。)新增函式:
os
模組封裝了以下 POSIX 系統呼叫:getresgid()
和getresuid()
,它們返回真實的、有效的和儲存的 GID 和 UID;setresgid()
和setresuid()
,它們將真實的、有效的和儲存的 GID 和 UID 設定為新值;initgroups()
,它初始化當前程序的組訪問列表。(GID/UID 函式由 Travis H. 貢獻;bpo-6508。initgroups 的支援由 Jean-Paul Calderone 新增;bpo-7333。)os.fork()
函式現在在子程序中重新初始化匯入鎖;這修復了在從執行緒呼叫fork()
時在 Solaris 上出現的問題。(由 Zsolt Cserna 修復;bpo-7242。)在
os.path
模組中,normpath()
和abspath()
函式現在保留 Unicode;如果它們的輸入路徑是 Unicode 字串,則返回值也是 Unicode 字串。(normpath()
由 Matt Giuca 在 bpo-5827 中修復;abspath()
由 Ezio Melotti 在 bpo-3426 中修復。)pydoc
模組現在提供 Python 使用的各種符號的幫助。 例如,您現在可以執行help('<<')
或help('@')
。(由 David Laban 貢獻;bpo-4739。)re
模組的split()
、sub()
和subn()
現在接受一個可選的 flags 引數,以便與模組中的其他函式保持一致。(由 Gregory P. Smith 新增。)新增函式:
run_path()
在runpy
模組中,它將執行提供的 path 引數處的程式碼。path 可以是 Python 原始檔 (example.py
)、編譯的位元組碼檔案 (example.pyc
)、目錄 (./package/
) 或 zip 存檔 (example.zip
) 的路徑。如果提供了目錄或 zip 路徑,它將被新增到sys.path
的前面,並且模組__main__
將被匯入。預期目錄或 zip 檔案包含__main__.py
;如果沒有,則可能會從sys.path
中靠後的位置匯入其他__main__.py
。這使得runpy
的更多機制可用於希望模仿 Python 命令列處理顯式路徑名稱方式的指令碼。(由 Nick Coghlan 新增;bpo-6816。)新增函式:在
shutil
模組中,make_archive()
接受檔名、存檔型別(zip 或 tar 格式)和目錄路徑,並建立一個包含目錄內容的存檔。(由 Tarek Ziadé 新增。)shutil
的copyfile()
和copytree()
函式現在在被要求複製命名管道時會引發SpecialFileError
異常。以前,該程式碼會像處理常規檔案一樣,開啟命名管道進行讀取,並且會無限期地阻塞。(由 Antoine Pitrou 修復;bpo-3002。)signal
模組不再重新安裝訊號處理程式,除非真正需要這樣做,這修復了一個可能導致無法可靠地捕獲 EINTR 訊號的錯誤。(由 Charles-Francois Natali 修復;bpo-8354。)新增函式:在
site
模組中,三個新函式返回各種特定於站點和使用者的路徑。getsitepackages()
返回包含所有全域性 site-packages 目錄的列表,getusersitepackages()
返回使用者 site-packages 目錄的路徑,並且getuserbase()
返回USER_BASE
環境變數的值,給出可用於儲存資料的目錄的路徑。(由 Tarek Ziadé 貢獻;bpo-6693。)site
模組現在報告在匯入sitecustomize
模組時發生的異常,並且將不再捕獲和吞噬KeyboardInterrupt
異常。(由 Victor Stinner 修復;bpo-3137。)create_connection()
函式增加了一個 source_address 引數,這是一個(host, port)
二元組,它給出了將用於連線的源地址。(由 Eldon Ziegler 貢獻;bpo-3972。)現在,
recv_into()
和recvfrom_into()
方法可以將資料寫入支援緩衝區 API 的物件中,最常用的就是bytearray
和memoryview
物件。(由 Antoine Pitrou 實現;bpo-8104。)SocketServer
模組的TCPServer
類現在支援套接字超時和停用 Nagle 演算法。disable_nagle_algorithm
類屬性預設為False
;如果覆蓋為 true,新的請求連線將設定 TCP_NODELAY 選項,以防止將多個小的傳送操作緩衝到一個 TCP 資料包中。timeout
類屬性可以儲存一個以秒為單位的超時時間,該超時時間將應用於請求套接字;如果在該時間內沒有收到任何請求,則會呼叫handle_timeout()
,並且handle_request()
將返回。(由 Kristján Valur Jónsson 貢獻;bpo-6192 和 bpo-6267。)更新的模組:
sqlite3
模組已更新到 pysqlite 包的 2.6.0 版本。2.6.0 版本包括許多錯誤修復,並增加了從共享庫載入 SQLite 擴充套件的功能。呼叫enable_load_extension(True)
方法來啟用擴充套件,然後呼叫load_extension()
來載入特定的共享庫。(由 Gerhard Häring 更新。)ssl
模組的SSLSocket
物件現在支援緩衝區 API,這修復了一個測試套件失敗的問題(由 Antoine Pitrou 修復;bpo-7133),並自動設定 OpenSSL 的SSL_MODE_AUTO_RETRY
,這將防止在觸發 SSL 重新協商時從recv()
操作返回錯誤程式碼(由 Antoine Pitrou 修復;bpo-8222)。現在,
wrap_socket()
建構函式接受一個 ciphers 引數,該引數是一個字串,列出了允許使用的加密演算法;該字串的格式在OpenSSL 文件中進行了描述。(由 Antoine Pitrou 新增;bpo-8322。)另一個更改使擴充套件載入所有 OpenSSL 的密碼和摘要演算法,以便它們都可用。某些 SSL 證書無法驗證,並報告“未知演算法”錯誤。(由 Beda Kosata 報告,並由 Antoine Pitrou 修復;bpo-8484。)
現在,所使用的 OpenSSL 版本可透過模組屬性
ssl.OPENSSL_VERSION
(字串)、ssl.OPENSSL_VERSION_INFO
(5 元組)和ssl.OPENSSL_VERSION_NUMBER
(整數)獲得。(由 Antoine Pitrou 新增;bpo-8321。)當值對於特定的整數格式程式碼(
bBhHiIlLqQ
之一)來說太大時,struct
模組將不再靜默地忽略溢位錯誤;現在,它總是引發struct.error
異常。(由 Mark Dickinson 更改;bpo-1523。)在嘗試__int__()
方法或報告錯誤之前,pack()
函式還將嘗試使用__index__()
來轉換和打包非整數。(由 Mark Dickinson 更改;bpo-8300。)新函式:
subprocess
模組的check_output()
使用指定的引數集執行命令,並在命令無錯誤執行時返回命令的輸出作為字串,否則會引發CalledProcessError
異常。>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(由 Gregory P. Smith 貢獻。)
現在,
subprocess
模組在接收到EINTR
訊號時將重試其內部系統呼叫。(由多人報告;由 Gregory P. Smith 在 bpo-1068268 中最終修復。)新函式:
is_declared_global()
在symtable
模組中,對於顯式宣告為全域性的變數返回 true,對於隱式全域性的變數返回 false。(由 Jeremy Hylton 貢獻。)現在,
syslog
模組將使用sys.argv[0]
的值作為識別符號,而不是之前的預設值'python'
。(由 Sean Reifschneider 更改;bpo-8451。)現在,
sys.version_info
值是一個命名元組,其屬性名為major
、minor
、micro
、releaselevel
和serial
。(由 Ross Light 貢獻;bpo-4285。)sys.getwindowsversion()
也返回一個命名元組,其屬性名為major
、minor
、build
、platform
、service_pack
、service_pack_major
、service_pack_minor
、suite_mask
和product_type
。(由 Brian Curtin 貢獻;bpo-7766。)tarfile
模組的預設錯誤處理已更改,不再抑制致命錯誤。之前的預設錯誤級別為 0,這意味著錯誤只會導致將訊息寫入除錯日誌,但由於預設情況下未啟用除錯日誌,因此這些錯誤會被忽略。現在的預設錯誤級別為 1,如果發生錯誤,則會引發異常。(由 Lars Gustäbel 更改;bpo-7357。)tarfile
現在支援過濾新增到 tar 檔案中的TarInfo
物件。當您呼叫add()
時,您可以提供一個可選的 *filter* 引數,它是一個可呼叫物件。該 *filter* 可呼叫物件將傳遞正在新增的每個檔案的TarInfo
,並且可以修改並返回它。如果可呼叫物件返回None
,則該檔案將從生成的存檔中排除。這比現有的 *exclude* 引數更強大,因此該引數已被棄用。(由 Lars Gustäbel 新增;bpo-6856。)TarFile
類現在也支援上下文管理協議。(由 Lars Gustäbel 新增;bpo-7232。)wait()
方法,屬於threading.Event
類,現在在退出時返回內部標誌。這意味著該方法通常會返回 true,因為wait()
應該會阻塞,直到內部標誌變為 true。僅當提供了超時並且操作超時時,返回值才會為 false。(由 Tim Lesher 貢獻;bpo-1674032。)unicodedata
模組提供的 Unicode 資料庫現在在內部用於確定哪些字元是數字、空格或表示換行符。該資料庫還包括來自Unihan.txt
資料檔案的資訊(由 Anders Chrigström 和 Amaury Forgeot d'Arc 提供補丁;bpo-1571184),並已更新到 5.2.0 版本(由 Florent Xicluna 更新;bpo-8024)。urlparse
模組的urlsplit()
現在以符合 RFC 3986 的方式處理未知的 URL 方案:如果 URL 的形式為"<something>://..."
,則將://
前的文字視為方案,即使它是一個模組不知道的虛構方案。此更改可能會破壞繞過舊行為的程式碼。例如,Python 2.6.4 或 2.5 將返回以下內容>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7(和 Python 2.6.5)將返回
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 實際上會產生略有不同的輸出,因為它會返回一個命名元組而不是標準元組。)
urlparse
模組還支援 RFC 2732 定義的 IPv6 字面地址(由 Senthil Kumaran 貢獻;bpo-2987)。>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
新類:
WeakSet
類,在weakref
模組中,是一個僅儲存對其元素的弱引用的集合;一旦沒有指向它們的引用,元素將被刪除。(最初由 Raymond Hettinger 在 Python 3.x 中實現,並由 Michael Foord 向後移植到 2.7。)xml.etree.ElementTree
庫,在輸出 XML 處理指令(看起來像<?xml-stylesheet href="#style1"?>
)或註釋(看起來像<!-- comment -->
)時,不再轉義與號和尖括號。(由 Neil Muller 提供補丁;bpo-2746。)XML-RPC 客戶端和伺服器,由
xmlrpclib
和SimpleXMLRPCServer
模組提供,透過支援 HTTP/1.1 keep-alive 和可選地使用 gzip 編碼壓縮交換的 XML,提高了效能。gzip 壓縮由SimpleXMLRPCRequestHandler
的encode_threshold
屬性控制,該屬性包含一個以位元組為單位的大小;大於此值的響應將被壓縮。(由 Kristján Valur Jónsson 貢獻;bpo-6267。)zipfile
模組的ZipFile
現在支援上下文管理協議,因此您可以編寫with zipfile.ZipFile(...) as f:
。(由 Brian Curtin 貢獻;bpo-5511。)zipfile
現在還支援存檔空目錄並正確提取它們。(由 Kuba Wieczorek 修復;bpo-4710。)從存檔中讀取檔案速度更快,並且交錯使用read()
和readline()
現在可以正常工作。(由 Nir Aides 貢獻;bpo-7610。)is_zipfile()
函式現在除了接受早期版本中接受的路徑名之外,還接受檔案物件。(由 Gabriel Genellina 貢獻;bpo-4756。)writestr()
方法現在有一個可選的 *compress_type* 引數,允許您覆蓋ZipFile
建構函式中指定的預設壓縮方法。(由 Ronald Oussoren 貢獻;bpo-6003。)
新模組:importlib¶
Python 3.1 包括 importlib
包,它是 Python 的 import
語句底層邏輯的重新實現。importlib
對於 Python 直譯器的實現者以及希望編寫可以參與匯入過程的新匯入器的使用者很有用。Python 2.7 不包含完整的 importlib
包,而是有一個包含單個函式 import_module()
的微小子集。
import_module(name, package=None)
匯入一個模組。name 是一個包含模組或包名稱的字串。可以透過提供以 .
字元開頭的字串來執行相對匯入,例如 ..utils.errors
。對於相對匯入,必須提供 package 引數,它是將用作相對匯入錨點的包的名稱。import_module()
既將匯入的模組插入到 sys.modules
中,又返回模組物件。
以下是一些示例
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib
由 Brett Cannon 實現,並在 Python 3.1 中引入。
新模組:sysconfig¶
sysconfig
模組已從 Distutils 包中分離出來,成為一個獨立的頂級模組。sysconfig
提供了獲取有關 Python 構建過程的資訊的函式:編譯器開關、安裝路徑、平臺名稱以及 Python 是否從其原始碼目錄執行。
該模組中的一些函式是
get_config_var()
返回來自 Python 的 Makefile 和pyconfig.h
檔案中的變數。get_config_vars()
返回包含所有配置變數的字典。get_path()
返回特定模組型別的配置路徑:標準庫、特定於站點的模組、特定於平臺的模組等。is_python_build()
如果您從 Python 原始碼樹執行二進位制檔案,則返回 true,否則返回 false。
有關更多詳細資訊和完整的函式列表,請查閱 sysconfig
文件。
Distutils 包和 sysconfig
現在由 Tarek Ziadé 維護,他還啟動了一個 Distutils2 包(原始碼庫位於 https://hg.python.org/distutils2/),用於開發下一代 Distutils 版本。
ttk:Tk 的主題小部件¶
Tcl/Tk 8.5 包括一組主題小部件,它們重新實現了基本的 Tk 小部件,但具有更可自定義的外觀,因此可以更接近地模仿原生平臺的視窗小部件。這個小部件集最初被稱為 Tile,但在新增到 Tcl/Tck 版本 8.5 時被重新命名為 Ttk(表示“主題 Tk”)。
要了解更多資訊,請閱讀 ttk
模組文件。您可能還希望閱讀 Tcl/Tk 手冊頁,其中描述了 Ttk 主題引擎,可從 https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html 獲取。Python/Ttk 程式碼的一些螢幕截圖位於 https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki。
tkinter.ttk
模組由 Guilherme Polo 編寫,並在 bpo-2983 中新增。由 Martin Franklin 編寫並由 Kevin Walzer 維護的名為 Tile.py
的替代版本被提議包含在 bpo-2618 中,但作者認為 Guilherme Polo 的工作更全面。
更新模組:unittest¶
unittest
模組得到了極大的增強;添加了許多新功能。除非另有說明,否則這些功能大多由 Michael Foord 實現。該模組的增強版本可以單獨下載,用於 Python 版本 2.4 至 2.6,打包為 unittest2
包,來自 unittest2。
從命令列使用時,該模組可以自動發現測試。它不如 py.test 或 nose 那樣花哨,但提供了一種簡單的方法來執行儲存在一組包目錄中的測試。例如,以下命令將在 test/
子目錄中搜索任何名為 test*.py
的可匯入測試檔案
python -m unittest discover -s test
有關更多詳細資訊,請參閱 unittest
模組文件。(在 bpo-6001 中開發。)
main()
函式支援一些其他新選項
-b
或--buffer
將在每個測試期間緩衝標準輸出和標準錯誤流。如果測試透過,則會丟棄任何生成的輸出;如果失敗,則會顯示緩衝的輸出。-c
或--catch
將使 control-C 中斷得到更優雅的處理。它不會立即中斷測試過程,而是完成當前正在執行的測試,然後報告直到中斷為止的部分結果。如果您不耐煩,第二次按下 control-C 將導致立即中斷。此 control-C 處理程式會嘗試避免在被測試的程式碼或正在執行的測試定義了自己的訊號處理程式時引起問題,它會注意到已經設定了訊號處理程式並呼叫它。如果這對您不起作用,則有一個
removeHandler()
修飾符,可用於標記應該停用 control-C 處理的測試。-f
或--failfast
使測試執行在測試失敗時立即停止,而不是繼續執行其他測試。(由 Cliff Dyer 建議並由 Michael Foord 實現;bpo-8074。)
以詳細模式執行時,進度訊息現在會為預期失敗顯示“x”,為意外成功顯示“u”。(由 Benjamin Peterson 貢獻。)
測試用例可以引發 SkipTest
異常來跳過測試(bpo-1034053)。
assertEqual()
、assertTrue()
和 assertFalse()
失敗的錯誤訊息現在提供了更多資訊。如果您將 longMessage
屬性設定為 TestCase
類的 true,則標準錯誤訊息和您提供的任何其他訊息都將在失敗時列印。(由 Michael Foord 新增;bpo-5663。)
當在不提供可執行物件的情況下呼叫時,assertRaises()
方法現在返回一個上下文處理程式。例如,您可以這樣寫
with self.assertRaises(KeyError):
{}['foo']
(由 Antoine Pitrou 實現;bpo-4444。)
現在支援模組級和類級 setup 和 teardown fixtures。模組可以包含 setUpModule()
和 tearDownModule()
函式。類可以具有 setUpClass()
和 tearDownClass()
方法,必須將其定義為類方法(使用 @classmethod
或等效方法)。當測試執行器切換到不同模組或類中的測試用例時,將呼叫這些函式和方法。
添加了方法 addCleanup()
和 doCleanups()
。addCleanup()
允許您新增清理函式,這些函式將被無條件呼叫(如果在 setUp()
失敗後呼叫,否則在 tearDown()
之後呼叫)。這使得測試期間的資源分配和釋放更加簡單 (bpo-5679)。
添加了許多提供更專業測試的新方法。這些方法中的許多是由谷歌工程師編寫的,用於他們的測試套件;Gregory P. Smith、Michael Foord 和 GvR 致力於將它們合併到 Python 版本的 unittest
中。
assertIsNone()
和assertIsNotNone()
接受一個表示式,並驗證結果是否為或不為None
。assertIs()
和assertIsNot()
接受兩個值,並檢查這兩個值是否評估為同一個物件或不是同一個物件。(由 Michael Foord 新增;bpo-2578。)assertIsInstance()
和assertNotIsInstance()
檢查結果物件是否為特定類或類元組的例項。(由 Georg Brandl 新增;bpo-7031。)assertGreater()
、assertGreaterEqual()
、assertLess()
和assertLessEqual()
比較兩個量。assertMultiLineEqual()
比較兩個字串,如果它們不相等,則會顯示一個有用的比較,突出顯示兩個字串中的差異。當使用assertEqual()
比較 Unicode 字串時,預設使用此比較。assertRegexpMatches()
和assertNotRegexpMatches()
檢查第一個引數是否為與作為第二個引數提供的正則表示式匹配或不匹配的字串 (bpo-8038)。assertRaisesRegexp()
檢查是否引發了特定的異常,然後還檢查異常的字串表示形式是否與提供的正則表示式匹配。assertIn()
和assertNotIn()
測試 *first* 是否在 *second* 中,或者不在 *second* 中。assertItemsEqual()
測試兩個提供的序列是否包含相同的元素。assertSetEqual()
比較兩個集合是否相等,並且僅在發生錯誤時報告集合之間的差異。類似地,
assertListEqual()
和assertTupleEqual()
比較指定的型別,並解釋任何差異,而不必列印它們的完整值;當使用assertEqual()
比較列表和元組時,現在預設使用這些方法。更一般地,assertSequenceEqual()
比較兩個序列,並且可以選擇檢查兩個序列是否為特定型別。assertDictEqual()
比較兩個字典並報告差異;當您使用assertEqual()
比較兩個字典時,現在預設使用此方法。assertDictContainsSubset()
檢查 *first* 中的所有鍵/值對是否在 *second* 中找到。assertAlmostEqual()
和assertNotAlmostEqual()
測試 *first* 和 *second* 是否近似相等。此方法可以將它們的差值四捨五入到可選指定的 *places* 位數(預設值為 7)並將其與零進行比較,或者要求差值小於提供的 *delta* 值。loadTestsFromName()
正確遵守suiteClass
的TestLoader
的屬性。(由 Mark Roddy 修復;bpo-6866。)一個新的鉤子允許您擴充套件
assertEqual()
方法來處理新的資料型別。addTypeEqualityFunc()
方法接受一個型別物件和一個函式。當兩個被比較的物件都是指定的型別時,將使用該函式。此函式應該比較兩個物件,並在它們不匹配時引發異常;該函式最好提供有關兩個物件不匹配的原因的附加資訊,就像新的序列比較方法一樣。
unittest.main()
現在接受一個可選的 exit
引數。如果為 false,則 main()
不會呼叫 sys.exit()
,從而允許從互動式直譯器中使用 main()
。(由 J. Pablo Fernández 貢獻;bpo-3379。)
TestResult
具有新的 startTestRun()
和 stopTestRun()
方法,這些方法在測試執行之前和之後立即呼叫。(由 Robert Collins 貢獻;bpo-5728。)
隨著所有這些更改,unittest.py
變得異常龐大,因此該模組被轉換為一個包,並將程式碼拆分為多個檔案(由 Benjamin Peterson 完成)。這不會影響模組的匯入或使用方式。
另請參閱
- https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml
描述了新功能、如何使用它們以及各種設計決策的理由。(作者:Michael Foord。)
更新的模組:ElementTree 1.3¶
Python 中包含的 ElementTree 庫的版本已更新至 1.3 版。一些新功能包括
各種解析函式現在採用 *parser* 關鍵字引數,該引數提供將使用的
XMLParser
例項。這使得可以覆蓋檔案的內部編碼p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
現在,解析 XML 中的錯誤會引發
ParseError
異常,該異常的例項具有position
屬性,其中包含一個 (line, column) 元組,指示問題發生的位置。ElementTree 將樹轉換為字串的程式碼已進行了重大改寫,在許多情況下速度大約提高了一倍。
ElementTree.write()
和Element.write()
方法現在有一個 method 引數,可以是 “xml”(預設)、“html” 或 “text”。 HTML 模式將空元素輸出為<empty></empty>
而不是<empty/>
,而文字模式將跳過元素,只輸出文本塊。如果將元素的tag
屬性設定為None
但保留其子元素,則在寫出樹時將忽略該元素,因此您無需進行更廣泛的重新排列來刪除單個元素。名稱空間處理也得到了改進。所有
xmlns:<whatever>
宣告現在都輸出在根元素上,而不是分散在生成的 XML 中。您可以透過設定default_namespace
屬性來設定樹的預設名稱空間,並可以使用register_namespace()
註冊新的字首。在 XML 模式下,您可以使用 true/false xml_declaration 引數來抑制 XML 宣告。新的
Element
方法:extend()
將序列中的項追加到元素的子元素中。元素本身的行為類似於序列,因此很容易將子元素從一個元素移動到另一個元素。from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Outputs <root><item>1</item>...</root> print ET.tostring(new)
新的
Element
方法:iter()
將元素的子元素作為生成器產生。也可以編寫for child in elem:
來迴圈訪問元素的子元素。現有的方法getiterator()
現在已棄用,getchildren()
也是如此,後者構造並返回子元素列表。新的
Element
方法:itertext()
將生成元素的所有後代文字塊。例如t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
已棄用:將元素用作布林值(即
if elem:
)如果元素有任何子元素則返回 true,如果沒有任何子元素則返回 false。這種行為令人困惑 -None
為 false,但沒有子元素的元素也為 false? - 因此現在將觸發FutureWarning
。在您的程式碼中,您應該明確:如果您對子元素的數量感興趣,請編寫len(elem) != 0
,或者編寫elem is not None
。
Fredrik Lundh 開發了 ElementTree 並製作了 1.3 版本;您可以在 https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm 上閱讀他描述 1.3 的文章。 Florent Xicluna 在 python-dev 和 bpo-6472 的討論之後更新了 Python 中包含的版本。)
構建和 C API 更改¶
Python 的構建過程和 C API 的更改包括
GNU 偵錯程式 GDB 7 的最新版本可以使用 Python 進行指令碼編寫。當您開始除錯可執行程式 P 時,GDB 將查詢名為
P-gdb.py
的檔案並自動讀取它。 Dave Malcolm 貢獻了一個python-gdb.py
,它添加了許多在除錯 Python 本身時有用的命令。例如,py-up
和py-down
上下移動一個 Python 堆疊幀,它通常對應於多個 C 堆疊幀。py-print
列印 Python 變數的值,py-bt
列印 Python 堆疊跟蹤。(根據 bpo-8032 新增。)如果您使用 Python 提供的
.gdbinit
檔案,則 2.7 版本中的 “pyo” 宏現在在被除錯的執行緒不持有 GIL 時也能正常工作;宏現在在列印之前獲取它。(由 Victor Stinner 貢獻;bpo-3632。)Py_AddPendingCall()
現在是執行緒安全的,允許任何工作執行緒向主 Python 執行緒提交通知。這對於非同步 IO 操作特別有用。(由 Kristján Valur Jónsson 貢獻;bpo-4293。)新函式:
PyCode_NewEmpty()
建立一個空程式碼物件;只需要檔名、函式名稱和第一行行號。這對於嘗試構造更有用的回溯堆疊的擴充套件模組很有用。以前,此類擴充套件需要呼叫PyCode_New()
,它有更多的引數。(由 Jeffrey Yasskin 新增。)新函式:
PyErr_NewExceptionWithDoc()
建立一個新的異常類,就像現有的PyErr_NewException()
一樣,但它接受一個額外的char *
引數,其中包含新異常類的文件字串。(由 Python 錯誤跟蹤器上的 ‘lekma’ 新增;bpo-7033。)新函式:
PyFrame_GetLineNumber()
接收一個幀物件,並返回幀當前正在執行的行號。以前,程式碼需要獲取當前正在執行的位元組碼指令的索引,然後查詢與該地址對應的行號。(由 Jeffrey Yasskin 新增。)新函式:
PyLong_AsLongAndOverflow()
和PyLong_AsLongLongAndOverflow()
將 Python 長整數近似為 C long 或 long long。如果該數字太大而無法放入輸出型別中,則會設定一個 overflow 標誌並返回給呼叫方。(由 Case Van Horsen 貢獻;bpo-7528 和 bpo-7767。)新函式:由於字串到浮點數轉換的重寫,添加了一個新的
PyOS_string_to_double()
函式。舊的PyOS_ascii_strtod()
和PyOS_ascii_atof()
函式現在已棄用。新函式:
PySys_SetArgvEx()
設定sys.argv
的值,並且可以根據 updatepath 引數的值,選擇性地更新sys.path
以包含由sys.argv[0]
命名的指令碼所在的目錄。新增此函式是為了彌補嵌入 Python 的應用程式中的一個安全漏洞。舊函式
PySys_SetArgv()
總是會更新sys.path
,有時還會添加當前目錄。這意味著,如果您在其他人控制的目錄中執行嵌入 Python 的應用程式,攻擊者可以在該目錄中放置一個木馬模組(例如,名為os.py
的檔案),您的應用程式隨後會匯入並執行該模組。如果您維護一個嵌入 Python 的 C/C++ 應用程式,請檢查您是否正在呼叫
PySys_SetArgv()
,並仔細考慮該應用程式是否應該使用 updatepath 設定為 false 的PySys_SetArgvEx()
。安全問題報告為 CVE 2008-5983;在 bpo-5753 中討論,並由 Antoine Pitrou 修復。
新宏:Python 標頭檔案現在定義了以下宏:
Py_ISALNUM
、Py_ISALPHA
、Py_ISDIGIT
、Py_ISLOWER
、Py_ISSPACE
、Py_ISUPPER
、Py_ISXDIGIT
、Py_TOLOWER
和Py_TOUPPER
。所有這些函式都類似於 C 標準的字元分類宏,但忽略當前的區域設定,因為在某些地方 Python 需要以獨立於區域設定的方式分析字元。(由 Eric Smith 新增;bpo-5793。)已刪除的函式:
PyEval_CallObject()
現在僅作為宏可用。保留函式版本是為了保持 ABI 連結相容性,但這在 1997 年就已經實現了;現在肯定可以刪除它了。(由 Antoine Pitrou 刪除;bpo-8276。)新格式程式碼:
PyString_FromFormat()
、PyString_FromFormatV()
和PyErr_Format()
函式現在接受%lld
和%llu
格式程式碼來顯示 C 的 long long 型別。(由 Mark Dickinson 貢獻;bpo-7228。)執行緒和程序派生之間複雜的互動已更改。以前,
os.fork()
建立的子程序可能會失敗,因為子程序僅使用一個執行緒執行建立,即執行os.fork()
的執行緒。如果其他執行緒在執行 fork 時持有鎖(例如 Python 的匯入鎖),則該鎖在新的程序中仍將標記為“持有”。但是在子程序中,沒有任何東西會釋放該鎖,因為其他執行緒沒有被複制,並且子程序將無法再執行匯入。Python 2.7 在執行
os.fork()
之前會獲取匯入鎖,並且還會清理使用threading
模組建立的任何鎖。具有內部鎖或自行呼叫fork()
的 C 擴充套件模組將不會受益於此清理。(由 Thomas Wouters 修復;bpo-1590864。)
Py_Finalize()
函式現在呼叫內部threading._shutdown()
函式;這可以防止在直譯器關閉時引發某些異常。(由 Adam Olsen 提供的補丁;bpo-1722344。)當使用
PyMemberDef
結構定義型別的屬性時,Python 將不再允許您嘗試刪除或設定T_STRING_INPLACE
屬性。由
ctypes
模組定義的全域性符號現在以Py
或_ctypes
為字首。(由 Thomas Heller 實現;bpo-3102。)新的配置選項:
--with-system-expat
開關允許構建pyexpat
模組以使用系統 Expat 庫。(由 Arfrever Frehtes Taifersar Arahesis 貢獻;bpo-7609。)新的配置選項:
--with-valgrind
選項現在將停用 pymalloc 分配器,Valgrind 記憶體錯誤檢測器很難正確分析該分配器。因此,Valgrind 將更好地檢測記憶體洩漏和溢位。(由 James Henstridge 貢獻;bpo-2422。)新的配置選項:現在您可以為
--with-dbmliborder=
提供一個空字串,以便停用所有各種 DBM 模組。(由 Arfrever Frehtes Taifersar Arahesis 新增;bpo-6491。)configure 指令碼現在檢查某些 32 位 Intel 晶片上的浮點舍入錯誤,並定義一個
X87_DOUBLE_ROUNDING
預處理器定義。當前沒有程式碼使用此定義,但是如果有人希望使用它,可以使用它。(由 Mark Dickinson 新增;bpo-2937。)configure 現在還設定一個
LDCXXSHARED
Makefile 變數以支援 C++ 連結。(由 Arfrever Frehtes Taifersar Arahesis 貢獻;bpo-1222585。)構建過程現在為 pkg-config 支援建立必要的檔案。(由 Clinton Roy 貢獻;bpo-3585。)
構建過程現在支援 Subversion 1.7。(由 Arfrever Frehtes Taifersar Arahesis 貢獻;bpo-6094。)
膠囊¶
Python 3.1 添加了一個新的 C 資料型別 PyCapsule
,用於為擴充套件模組提供 C API。膠囊本質上是 C void *
指標的持有者,並作為模組屬性提供;例如,socket
模組的 API 以 socket.CAPI
的形式公開,而 unicodedata
公開 ucnhash_CAPI
。其他擴充套件可以匯入該模組,訪問其字典以獲取膠囊物件,然後獲取 void *
指標,該指標通常指向指向該模組的各種 API 函式的指標陣列。
已經存在用於此目的的資料型別 PyCObject
,但是它不提供型別安全。用純 Python 編寫的惡意程式碼可能會導致分段錯誤,方法是從模組 A 中獲取 PyCObject
,並以某種方式將其替換為模組 B 中的 PyCObject
。膠囊知道自己的名稱,並且獲取指標需要提供名稱
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
您可以確保 vtable
指向您期望的任何內容。如果傳入了不同的膠囊,則 PyCapsule_IsValid()
將檢測到不匹配的名稱並返回 false。有關使用這些物件的更多資訊,請參閱 為擴充套件模組提供 C API。
Python 2.7 現在在內部使用膠囊來提供各種擴充套件模組 API,但是修改了 PyCObject_AsVoidPtr()
以處理膠囊,從而保持與 PyCObject
介面的編譯時相容性。使用 PyCObject_AsVoidPtr()
將發出一個 PendingDeprecationWarning
,預設情況下它是靜默的。
由 Larry Hastings 在 Python 3.1 中實現並向後移植到 2.7;在 bpo-5630 中討論。
特定於埠的更改:Windows¶
msvcrt
模組現在包含來自crtassem.h
標頭檔案的一些常量:CRT_ASSEMBLY_VERSION
、VC_ASSEMBLY_PUBLICKEYTOKEN
和LIBRARIES_ASSEMBLY_NAME_PREFIX
。(由 David Cournapeau 貢獻;bpo-4365。)用於訪問登錄檔的
_winreg
模組現在實現了CreateKeyEx()
和DeleteKeyEx()
函式,它們是先前支援的函式的擴充套件版本,接受幾個額外的引數。DisableReflectionKey()
、EnableReflectionKey()
和QueryReflectionKey()
也經過了測試和文件記錄。(由 Brian Curtin 實現:bpo-7347。)新的
_beginthreadex()
API 用於啟動執行緒,並且現在使用本地執行緒區域性儲存函式。(由 Kristján Valur Jónsson 貢獻;bpo-3582。)os.kill()
函式現在可以在 Windows 上工作。訊號值可以是常量CTRL_C_EVENT
、CTRL_BREAK_EVENT
或任何整數。前兩個常量將向子程序傳送 Control-C 和 Control-Break 按鍵事件;任何其他值將使用TerminateProcess()
API。(由 Miki Tebeka 貢獻;bpo-1220212。)os.listdir()
函式現在可以正確地處理空路徑。(由 Hirokazu Yamamoto 修復;bpo-5913。)mimetypes
模組現在會在初始化時從 Windows 登錄檔中讀取 MIME 資料庫。(由 Gabriel Genellina 修復;bpo-4969。)
特定於埠的更改:Mac OS X¶
為了在系統安裝和同一版本的使用者安裝副本之間共享新增的軟體包,路徑
/Library/Python/2.7/site-packages
現在被附加到sys.path
。(由 Ronald Oussoren 更改;bpo-4865。)在 2.7.13 版本中更改:從 2.7.13 版本開始,此更改已被刪除。對於使用者安裝的 Python,如來自 python.org 安裝程式的 Python,
/Library/Python/2.7/site-packages
,即 Apple 提供的系統 Python 2.7 使用的 site-packages 目錄,不再附加到sys.path
。從 macOS 10.12 開始,Apple 更改了系統 site-packages 目錄的配置方式,這可能導致安裝 pip 元件(如 setuptools)失敗。為系統 Python 安裝的軟體包將不再與使用者安裝的 Python 共享。(bpo-28440)
特定於埠的更改:FreeBSD¶
FreeBSD 7.1 的
SO_SETFIB
常量,與socket()
方法getsockopt()
/setsockopt()
一起使用以選擇備用路由表,現在可以在socket
模組中使用。(由 Kyle VanderBeek 新增;bpo-8235。)
其他更改和修復¶
兩個基準測試指令碼
iobench
和ccbench
已新增到Tools
目錄。iobench
測量open()
返回的內建檔案 I/O 物件在執行各種操作時的速度,而ccbench
是一個併發基準測試,它嘗試測量使用不同數量的執行緒執行多個任務時的計算吞吐量、執行緒切換延遲和 I/O 處理頻寬。Tools/i18n/msgfmt.py
指令碼現在可以理解.po
檔案中的複數形式。(由 Martin von Löwis 修復;bpo-5464。)當從帶有現有
.py
對應檔案的.pyc
或.pyo
檔案匯入模組時,當原始檔名過時時,會覆蓋結果程式碼物件的co_filename
屬性。如果檔案已重新命名、移動或透過不同的路徑訪問,則可能發生這種情況。(由 Ziga Seilnacht 和 Jean-Paul Calderone 修復;bpo-1180193。)regrtest.py
指令碼現在採用--randseed=
開關,該開關接受一個整數,該整數將用作-r
選項的隨機種子,該選項以隨機順序執行測試。-r
選項還會報告使用的種子(由 Collin Winter 新增。)regrtest.py
的另一個開關是-j
,它接受一個整數,指定多少個測試並行執行。這允許在多核機器上減少總執行時間。此選項與多個其他選項相容,包括已知會產生長時間執行的-R
開關。(由 Antoine Pitrou 新增,bpo-6152。)它還可以與新的-F
開關一起使用,該開關迴圈執行選定的測試,直到它們失敗。(由 Antoine Pitrou 新增;bpo-7312。)當作為指令碼執行時,
py_compile.py
模組現在接受'-'
作為引數,它將從標準輸入讀取要編譯的檔名列表。(由 Piotr Ożarowski 貢獻;bpo-8233。)
移植到 Python 2.7¶
本節列出了先前描述的更改和其他錯誤修復,這些更改可能需要更改您的程式碼
range()
函式更一致地處理其引數;它現在將對提供給它的非浮點、非整數引數呼叫__int__()
。(由 Alexander Belopolsky 修復;bpo-1533。)字串
format()
方法將浮點數和複數的預設精度從 6 位小數更改為 12 位小數,這與str()
使用的精度匹配。(由 Eric Smith 更改;bpo-5920。)由於對
with
語句的最佳化,特殊方法__enter__()
和__exit__()
必須屬於物件的型別,而不能直接附加到物件的例項。這會影響新式類(從object
派生)和 C 擴充套件型別。(bpo-6101。)由於 Python 2.6 中的一個錯誤,
__exit__()
方法的 exc_value 引數通常是異常的字串表示形式,而不是例項。這個問題在 2.7 中得到了修復,因此 exc_value 將按預期成為一個例項。(由 Florent Xicluna 修復;bpo-7853。)當使用
__slots__
設定了受限的屬性集時,刪除未設定的屬性不會像預期那樣引發AttributeError
。由 Benjamin Peterson 修復;bpo-7604。)
在標準庫中
對
datetime
例項進行操作,如果結果年份超出支援的範圍,以前不總是會引發OverflowError
異常。現在對此類錯誤進行了更仔細的檢查,並且會引發該異常。(由 Mark Leander 報告,Anand B. Pillai 和 Alexander Belopolsky 提供了補丁;bpo-7150。)當將
Decimal
例項與字串的format()
方法一起使用時,預設對齊方式以前是左對齊。現在已更改為右對齊,這可能會更改程式的輸出。(由 Mark Dickinson 更改;bpo-6857。)涉及訊號 NaN 值(或
sNAN
)的比較現在會發出InvalidOperation
訊號,而不是根據比較運算子靜默地返回 true 或 false 值。現在,安靜的 NaN 值(或NaN
)是可雜湊的。(由 Mark Dickinson 修復;bpo-7279。)xml.etree.ElementTree
庫在輸出 XML 處理指令(看起來像<?xml-stylesheet href="#style1"?>
)或註釋(看起來像<!-- comment -->
)時,不再轉義 & 符號和尖括號。(Neil Muller 提供了補丁;bpo-2746。)StringIO
物件的readline()
方法現在在請求負長度時,會像其他類檔案物件一樣不執行任何操作。(bpo-7348)。現在,
syslog
模組將使用sys.argv[0]
的值作為識別符號,而不是之前的預設值'python'
。(由 Sean Reifschneider 更改;bpo-8451。)tarfile
模組的預設錯誤處理已更改,不再抑制致命錯誤。之前的預設錯誤級別為 0,這意味著錯誤只會導致將訊息寫入除錯日誌,但由於預設情況下未啟用除錯日誌,因此這些錯誤會被忽略。現在的預設錯誤級別為 1,如果發生錯誤,則會引發異常。(由 Lars Gustäbel 更改;bpo-7357。)urlparse
模組的urlsplit()
現在以符合 RFC 3986 的方式處理未知的 URL 方案:如果 URL 的形式為"<something>://..."
,則://
之前的文字將被視為方案,即使它是一個模組不知道的虛構方案。此更改可能會破壞繞開舊行為的程式碼。例如,Python 2.6.4 或 2.5 將返回以下內容>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7(和 Python 2.6.5)將返回
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 實際上會產生略有不同的輸出,因為它會返回一個命名元組而不是標準元組。)
對於 C 擴充套件
使用
PyArg_Parse*
函式族的整數格式程式碼的 C 擴充套件現在會引發TypeError
異常,而不是觸發DeprecationWarning
(bpo-5080)。請使用新的
PyOS_string_to_double()
函式,而不是現在已棄用的舊PyOS_ascii_strtod()
和PyOS_ascii_atof()
函式。
對於嵌入 Python 的應用程式
添加了
PySys_SetArgvEx()
函式,允許應用程式在使用現有的PySys_SetArgv()
函式時關閉安全漏洞。請檢查您是否正在呼叫PySys_SetArgv()
,並仔細考慮應用程式是否應該使用 updatepath 設定為 false 的PySys_SetArgvEx()
。
新增到 Python 2.7 維護版本中的新功能¶
當情況確實需要時,可能會在 Python 2.7 維護版本中新增新功能。任何此類新增都必須透過 Python 增強提案流程,並提出令人信服的理由,說明為什麼不能僅透過將新功能新增到 Python 3 中或將其釋出在 Python 包索引中來充分解決這些問題。
除了下面列出的特定提案外,還有一個通用豁免,允許在任何 Python 2.7 維護版本中新增新的 -3
警告。
除錯模式的兩個新環境變數¶
在除錯模式下,預設情況下不寫入 [xxx refs]
統計資訊,現在還必須設定 PYTHONSHOWREFCOUNT
環境變數。(由 Victor Stinner 提供;bpo-31733。)
當使用定義的 COUNT_ALLOC
編譯 Python 時,預設情況下不再轉儲分配計數:現在還必須設定 PYTHONSHOWALLOCCOUNT
環境變數。此外,分配計數現在被轉儲到 stderr,而不是 stdout。(由 Victor Stinner 提供;bpo-31692。)
在 2.7.15 版本中新增。
PEP 434:所有分支的 IDLE 增強異常¶
PEP 434 描述了對隨 Python 一起提供的 IDLE 開發環境所做的更改的一般豁免。此豁免使得 IDLE 開發人員可以在所有受支援的 Python 2 和 3 版本中提供更一致的使用者體驗。
有關任何 IDLE 更改的詳細資訊,請參閱特定版本的 NEWS 檔案。
PEP 466:Python 2.7 的網路安全增強功能¶
PEP 466 描述了已被批准包含在 Python 2.7 維護版本中的一些網路安全增強提案,其中第一個更改出現在 Python 2.7.7 版本中。
PEP 466 在 Python 2.7.7 中新增的相關功能
從 Python 3 反向移植了
hmac.compare_digest()
,以便為 Python 2 應用程式提供抗時序攻擊的比較操作。(由 Alex Gaynor 提供;bpo-21306。)在 python.org 上釋出的官方 Windows 安裝程式中升級了 OpenSSL 1.0.1g。(由 Zachary Ware 提供;bpo-21462。)
PEP 466 在 Python 2.7.8 中新增的相關功能
從 Python 3 反向移植了
hashlib.pbkdf2_hmac()
,以便為 Python 2 應用程式廣泛提供適用於安全密碼儲存的雜湊演算法。(由 Alex Gaynor 提供;bpo-21304。)為在 python.org 上釋出的官方 Windows 安裝程序升級了 OpenSSL 1.0.1h。(由 Zachary Ware 在 bpo-21671 中為 CVE 2014-0224 提供。)
PEP 466 在 Python 2.7.9 中新增的相關功能
Python 3.4 的
ssl
模組的大部分功能已被向後移植。這意味著ssl
現在支援伺服器名稱指示(Server Name Indication)、TLS1.x 設定、訪問平臺證書儲存、SSLContext
類以及其他功能。(由 Alex Gaynor 和 David Reid 貢獻;bpo-21308。)有關具體詳細資訊,請參閱模組文件中的“新增版本:2.7.9”註釋。
os.urandom()
已被更改為快取指向/dev/urandom
的檔案描述符,而不是在每次呼叫時重新開啟/dev/urandom
。(由 Alex Gaynor 貢獻;bpo-21305。)hashlib.algorithms_guaranteed
和hashlib.algorithms_available
從 Python 3 向後移植,以方便 Python 2 應用程式選擇最強的可用雜湊演算法。(由 Alex Gaynor 在 bpo-21307 中貢獻)
PEP 477:將 ensurepip (PEP 453) 向後移植到 Python 2.7¶
PEP 477 批准在 Python 2.7 維護版本中包含 PEP 453 ensurepip 模組以及由此啟用的改進的文件,首次出現在 Python 2.7.9 版本中。
預設引導 pip¶
新的 ensurepip
模組(在 PEP 453 中定義)提供了一個標準的跨平臺機制,用於將 pip 安裝程式引導到 Python 安裝中。Python 2.7.9 中包含的 pip
版本是 pip
1.5.6,未來的 2.7.x 維護版本會將捆綁版本更新為建立候選版本時可用的最新 pip
版本。
預設情況下,命令 pip
、pipX
和 pipX.Y
將安裝在所有平臺上(其中 X.Y 代表 Python 安裝的版本),同時還會安裝 pip
Python 包及其依賴項。
對於 CPython 在 POSIX 系統上的原始碼構建,make install
和 make altinstall
命令預設情況下不引導 pip
。可以透過配置選項控制此行為,並透過 Makefile 選項覆蓋此行為。
在 Windows 和 Mac OS X 上,CPython 安裝程式現在預設安裝 pip
以及 CPython 本身(使用者可以選擇在安裝過程中不安裝它)。Windows 使用者需要選擇加入自動 PATH
修改,以便預設情況下可以從命令列使用 pip
,否則仍然可以透過 Windows 的 Python 啟動器作為 py -m pip
訪問它。
正如 PEP 中討論的那樣,平臺打包者可以選擇預設不安裝這些命令,只要在呼叫時,它們提供關於如何在平臺上安裝它們的清晰簡單的指導(通常使用系統包管理器)。
文件更改¶
作為此更改的一部分,文件的 安裝 Python 模組 和 分發 Python 模組 部分已被完全重新設計為簡短的入門和常見問題解答文件。大多數打包文件現在已移至 Python Packaging Authority 維護的 Python 打包使用者指南 和各個專案的文件中。
但是,由於此遷移目前仍未完成,這些指南的舊版本仍然作為 使用 setuptools 構建 C 和 C++ 擴充套件 和 使用 setuptools 構建 C 和 C++ 擴充套件 提供。
另請參閱
- PEP 453 – Python 安裝中 pip 的顯式引導
由 Donald Stufft 和 Nick Coghlan 編寫的 PEP,由 Donald Stufft、Nick Coghlan、Martin von Löwis 和 Ned Deily 實現。
PEP 476:預設情況下為 stdlib http 客戶端啟用證書驗證¶
PEP 476 更新了 httplib
以及使用它的模組,例如 urllib2
和 xmlrpclib
,現在預設情況下會驗證伺服器是否出示了由平臺信任儲存中的證書頒發機構簽名的證書,並且其主機名與請求的主機名匹配,從而顯著提高了許多應用程式的安全性。此更改是在 Python 2.7.9 版本中進行的。
對於需要舊行為的應用程式,它們可以傳遞一個備用上下文。
import urllib2
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493:Python 2.7 的 HTTPS 驗證遷移工具¶
PEP 493 提供了額外的遷移工具,以支援在建立客戶端 HTTPS 連線時,包含依賴於歷史上允許的伺服器證書處理的應用程式和環境進行更漸進式的基礎設施升級過程。這些新增是在 Python 2.7.12 版本中進行的。
這些工具旨在用於在無法修改受影響的應用程式和服務以在建立連線時顯式傳遞更寬鬆的 SSL 上下文的情況下。
對於根本無法修改的應用程式和服務,可以將新的 PYTHONHTTPSVERIFY
環境變數設定為 0
,以將整個 Python 程序恢復到 Python 2.7.8 及更早版本的預設寬鬆行為。
對於無法修改連線建立程式碼但可以修改整個應用程式的情況,可以使用新的 ssl._https_verify_certificates()
函式在執行時調整預設行為。
新的 make regen-all
構建目標¶
為了簡化交叉編譯,並確保 CPython 可以可靠地編譯而無需現有版本的 Python,基於 autotools 的構建系統不再嘗試基於檔案修改時間隱式重新編譯生成的檔案。
相反,添加了一個新的 make regen-all
命令,以便在需要時(例如,在基於預生成版本已經構建了初始版本的 Python 後)強制重新生成這些檔案。
還定義了更具選擇性的重新生成目標 - 有關詳細資訊,請參見 Makefile.pre.in。
(由 Victor Stinner 在 bpo-23404 中貢獻。)
在 2.7.14 版本中新增。
刪除 make touch
構建目標¶
以前用於透過更新修改時間來請求隱式重新生成生成檔案的 make touch
構建目標已刪除。
它已被新的 make regen-all
目標取代。
(由 Victor Stinner 在 bpo-23404 中貢獻。)
在 2.7.14 版本中更改。
致謝¶
作者感謝以下人士對本文的各個草案提供了建議、更正和幫助:Nick Coghlan、Philip Jenvey、Ryan Lovett、R. David Murray、Hugh Secker-Walker。