Python 3.6 新特性¶
- 編輯:
Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>
本文介紹了 Python 3.6 相對於 3.5 的新特性。Python 3.6 於 2016 年 12 月 23 日釋出。請參閱 更改日誌 以獲取完整的更改列表。
另請參閱
PEP 494 - Python 3.6 釋出計劃
摘要 – 版本亮點¶
新語法特性
新的庫模組
CPython 實現改進
dict 型別已被重新實現,使用基於 Raymond Hettinger 的提議,並類似於 PyPy dict 實現 的 更緊湊的表示。這使得字典與 Python 3.5 相比,記憶體使用量減少了 20% 到 25%。
使用 新協議 簡化了類建立的自定義。
類屬性的定義順序現在被保留。
**kwargs
中元素的順序現在與關鍵字引數傳遞給函式的順序相對應。已新增 DTrace 和 SystemTap 探測支援。
新的 PYTHONMALLOC 環境變數現在可以用於除錯直譯器記憶體分配和訪問錯誤。
標準庫中的重大改進
asyncio
模組已收到新特性、顯著的可用性和效能改進,以及相當多的 bug 修復。從 Python 3.6 開始,asyncio
模組不再是臨時性的,其 API 被認為是穩定的。tracemalloc
模組已被大幅重構,現在用於為ResourceWarning
提供更好的輸出,併為記憶體分配錯誤提供更好的診斷。請參閱 PYTHONMALLOC 部分 以瞭解更多資訊。
安全改進
已新增新的
secrets
模組,以簡化生成適用於管理帳戶身份驗證、令牌等金鑰的加密強偽隨機數的過程。在 Linux 上,
os.urandom()
現在會阻塞,直到系統 urandom 熵池初始化以提高安全性。請參閱 PEP 524 以瞭解其原理。已改進
ssl
模組的預設設定和特性集。hashlib
模組接收了對 BLAKE2、SHA-3 和 SHAKE 雜湊演算法以及scrypt()
金鑰派生函式的支援。
Windows 改進
當互動式使用
py.exe
啟動器時,如果使用者沒有指定版本(透過命令列引數或配置檔案),它不再優先選擇 Python 2 而不是 Python 3。 Shebang 行的處理方式保持不變 - 在這種情況下,“python” 指的是 Python 2。python.exe
和pythonw.exe
已被標記為支援長路徑,這意味著 260 個字元的路徑限制可能不再適用。有關詳細資訊,請參閱 移除 MAX_PATH 限制。可以新增一個
._pth
檔案來強制隔離模式,並完全指定所有搜尋路徑,以避免登錄檔和環境查詢。有關更多資訊,請參閱文件。現在,
python36.zip
檔案可以作為推斷PYTHONHOME
的標誌。 有關更多資訊,請參閱 文件。
新功能¶
PEP 498: 格式化字串字面量¶
PEP 498 引入了一種新的字串字面量:f-字串,或 格式化字串字面量。
格式化字串字面量以 'f'
為字首,類似於 str.format()
接受的格式化字串。它們包含用大括號包圍的替換欄位。替換欄位是表示式,在執行時求值,然後使用 format()
協議進行格式化。
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
PEP 526:變數註解的語法¶
PEP 484 引入了函式引數型別註解的標準,也稱為型別提示。此 PEP 為 Python 添加了語法,用於註解變數(包括類變數和例項變數)的型別。
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
與函式註解一樣,Python 直譯器不附加任何特定含義給變數註解,僅將其儲存在類或模組的 __annotations__
屬性中。
與靜態型別語言中的變數宣告相比,註解語法的目標是透過抽象語法樹和 __annotations__
屬性為第三方工具和庫提供一種簡單的方式來指定結構化的型別元資料。
PEP 515: 數字字面量中的下劃線¶
PEP 515 增加了在數字字面量中使用下劃線以提高可讀性的能力。 例如:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
允許在數字之間和任何基數說明符之後使用單個下劃線。 不允許連續的前導、尾隨或多個下劃線。
字串格式化語言現在也支援 '_'
選項,以表示使用下劃線作為浮點數表示型別和整數表示型別 'd'
的千位分隔符。對於整數表示型別 'b'
, 'o'
, 'x'
和 'X'
,下劃線將每 4 位插入一次。
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
另請參閱
- PEP 515 – 數字字面量中的下劃線。
PEP 由 Georg Brandl 和 Serhiy Storchaka 編寫。
PEP 525: 非同步生成器¶
PEP 492 為 Python 3.5 引入了對原生協程和 async
/ await
語法的支援。 Python 3.5 實現的一個顯著限制是在同一個函式體中無法同時使用 await
和 yield
。在 Python 3.6 中,此限制已被取消,從而可以定義非同步生成器。
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
新語法允許更快更簡潔的程式碼。
另請參閱
- PEP 525 – 非同步生成器。
PEP 由 Yury Selivanov 編寫和實現。
PEP 530:非同步推導式¶
PEP 530 添加了對在列表、集合、字典推導式和生成器表示式中使用 async for
的支援。
result = [i async for i in aiter() if i % 2]
此外,所有型別的推導式都支援 await
表示式。
result = [await fun() for fun in funcs if await condition()]
另請參閱
- PEP 530 – 非同步推導式。
PEP 由 Yury Selivanov 編寫和實現。
PEP 487:更簡單的類建立自定義¶
現在可以在不使用元類的情況下自定義子類的建立。 每當建立新的子類時,都會在基類上呼叫新的 __init_subclass__
類方法。
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
為了允許從 __init_subclass__()
實現中正確呼叫零引數的 super()
,自定義元類必須確保新的 __classcell__
名稱空間條目傳播到 type.__new__
(如 建立類物件 中所述)。
PEP 487:描述符協議增強¶
PEP 487 擴充套件了描述符協議,以包含新的可選的 __set_name__()
方法。每當定義一個新類時,都會在定義中包含的所有描述符上呼叫新方法,從而為它們提供對正在定義的類的引用以及在類名稱空間中給描述符的名稱。換句話說,描述符的例項現在可以知道描述符在所有者類中的屬性名稱。
class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# this is the new initializer:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()
PEP 519:新增檔案系統路徑協議¶
檔案系統路徑在歷史上一直表示為 str
或 bytes
物件。這導致編寫操作檔案系統路徑的程式碼的人員假設此類物件只是這兩種型別之一(表示檔案描述符的 int
不算在內,因為它不是檔案路徑)。不幸的是,這種假設阻止了檔案系統路徑的替代物件表示形式(如 pathlib
)與包括 Python 標準庫在內的現有程式碼一起工作。
為了解決這種情況,定義了一個由 os.PathLike
表示的新介面。透過實現 __fspath__()
方法,一個物件表示它代表一個路徑。然後,一個物件可以提供檔案系統路徑的底層表示形式,作為 str
或 bytes
物件。這意味著,如果一個物件實現了 os.PathLike
,或者是一個表示檔案系統路徑的 str
或 bytes
物件,那麼它就被認為是 路徑型 的。程式碼可以使用 os.fspath()
、 os.fsdecode()
或 os.fsencode()
來顯式獲取路徑型物件的 str
和/或 bytes
表示形式。
內建的 open()
函式已更新為接受 os.PathLike
物件,os
和 os.path
模組中的所有相關函式,以及標準庫中的大多數其他函式和類也是如此。os.DirEntry
類和 pathlib
中的相關類也已更新為實現 os.PathLike
。
我們希望更新用於操作檔案系統路徑的基本函式將導致第三方程式碼隱式支援所有 路徑型物件,而無需任何程式碼更改,或者至少是非常小的更改(例如,在操作路徑型物件之前,在程式碼開頭呼叫 os.fspath()
)。
以下是一些示例,說明了新介面如何使 pathlib.Path
更容易、更透明地與現有程式碼一起使用
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(由 Brett Cannon、Ethan Furman、Dusty Phillips 和 Jelle Zijlstra 實現。)
另請參閱
- PEP 519 – 新增檔案系統路徑協議
由 Brett Cannon 和 Koos Zevenhoven 編寫的 PEP。
PEP 495:本地時間歧義¶
在世界上大多數地區,都存在過去和將來本地時鐘回撥的情況。在這些時候,會引入一些時間間隔,在這些時間間隔內,本地時鐘在同一天內會兩次顯示相同的時間。在這些情況下,本地時鐘上顯示的資訊(或儲存在 Python datetime 例項中的資訊)不足以識別特定的時間點。
PEP 495 將新的 fold 屬性新增到 datetime.datetime
和 datetime.time
類的例項中,以區分本地時間相同的兩個時間點
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
對於所有例項,除了在有歧義的情況下表示第二個(按時間順序)時間點的例項外, fold
屬性的值為 0
。
另請參閱
- PEP 495 – 本地時間歧義
由 Alexander Belopolsky 和 Tim Peters 編寫的 PEP,由 Alexander Belopolsky 實現。
PEP 529:將 Windows 檔案系統編碼更改為 UTF-8¶
表示檔案系統路徑最好使用 str (Unicode) 而不是位元組。但是,在某些情況下,使用位元組就足夠且正確。
在 Python 3.6 之前,在 Windows 上使用位元組路徑可能會導致資料丟失。進行此更改後,現在 Windows 上支援使用位元組來表示路徑,前提是這些位元組使用 sys.getfilesystemencoding()
返回的編碼進行編碼,現在預設為 'utf-8'
。
不使用 str 來表示路徑的應用程式應使用 os.fsencode()
和 os.fsdecode()
來確保其位元組得到正確編碼。要恢復到以前的行為,請設定 PYTHONLEGACYWINDOWSFSENCODING
或呼叫 sys._enablelegacywindowsfsencoding()
。
有關更多資訊以及可能需要的程式碼修改討論,請參見 PEP 529。
PEP 528:將 Windows 控制檯編碼更改為 UTF-8¶
Windows 上的預設控制檯現在將接受所有 Unicode 字元,併為 Python 程式碼提供正確讀取的 str 物件。sys.stdin
、sys.stdout
和 sys.stderr
現在預設為 utf-8 編碼。
此更改僅在使用互動式控制檯時適用,而在重定向檔案或管道時不適用。要恢復到以前的互動式控制檯使用行為,請設定 PYTHONLEGACYWINDOWSSTDIO
。
另請參閱
- PEP 528 – 將 Windows 控制檯編碼更改為 UTF-8
由 Steve Dower 編寫和實現的 PEP。
PEP 520:保留類屬性定義順序¶
類定義體中的屬性具有自然的順序:與名稱在原始碼中出現的順序相同。此順序現在儲存在新類的 __dict__
屬性中。
此外,有效的預設類執行名稱空間(從 type.__prepare__() 返回)現在是一個保留插入順序的對映。
另請參閱
- PEP 520 – 保留類屬性定義順序
由 Eric Snow 編寫和實現的 PEP。
PEP 468:保留關鍵字引數順序¶
函式簽名中的 **kwargs
現在保證是一個保留插入順序的對映。
另請參閱
- PEP 468 – 保留關鍵字引數順序
由 Eric Snow 編寫和實現的 PEP。
新的 dict 實現¶
dict 型別現在使用基於 Raymond Hettinger 的提案 的“緊湊”表示形式,該提案 首先由 PyPy 實現。與 Python 3.5 相比,新的 dict()
的記憶體使用量減少了 20% 到 25%。
這種新實現的順序保留特性被認為是實現細節,不應依賴它(將來可能會更改,但希望在更改語言規範以強制所有當前和未來的 Python 實現都具有順序保留語義之前,在語言中保留此新字典實現幾個版本;這也有助於保持與舊版本語言的向後相容性,在舊版本語言中,仍然採用隨機迭代順序,例如 Python 3.5)。
(由 INADA Naoki 在 bpo-27350 中貢獻。該想法最初由 Raymond Hettinger 提出。)
PEP 523:向 CPython 新增框架評估 API¶
雖然 Python 提供了廣泛的支援來定製程式碼的執行方式,但在框架物件的評估方面,它並沒有這樣做。如果你想在 Python 中以某種方式攔截框架評估,除非直接操作已定義函式的函式指標,否則真的沒有任何方法。
PEP 523 透過提供一個 API 使框架評估在 C 級別可插拔,從而改變了這一點。這將允許偵錯程式和 JIT 等工具在 Python 程式碼開始執行之前攔截框架評估。這使得可以使用替代的 Python 程式碼評估實現、跟蹤框架評估等。
此 API 不屬於受限 C API 的一部分,並被標記為私有,以表明此 API 的使用預計將受到限制,並且僅適用於非常特定的低階用例。API 的語義將根據 Python 的需要進行更改。
另請參閱
- PEP 523 – 向 CPython 新增框架評估 API
PEP 由 Brett Cannon 和 Dino Viehland 編寫。
PYTHONMALLOC 環境變數¶
新的 PYTHONMALLOC
環境變數允許設定 Python 記憶體分配器並安裝除錯鉤子。
現在可以使用 PYTHONMALLOC=debug
在釋出模式下編譯的 Python 上安裝 Python 記憶體分配器的除錯鉤子。除錯鉤子的效果
新分配的記憶體將填充位元組
0xCB
釋放的記憶體將填充位元組
0xDB
檢測違反 Python 記憶體分配器 API 的行為。例如,在由
PyMem_Malloc()
分配的記憶體塊上呼叫PyObject_Free()
。檢測緩衝區起始位置之前的寫入(緩衝區下溢)
檢測緩衝區結束位置之後的寫入(緩衝區溢位)
檢查呼叫
PYMEM_DOMAIN_OBJ
(例如:PyObject_Malloc()
)和PYMEM_DOMAIN_MEM
(例如:PyMem_Malloc()
)域的分配器函式時是否持有GIL。
檢查是否持有 GIL 也是 Python 3.6 的新特性。
有關 Python 記憶體分配器的除錯鉤子,請參閱 PyMem_SetupDebugHooks()
函式。
現在還可以強制對所有 Python 記憶體分配使用 C 庫的 malloc()
分配器,方法是使用 PYTHONMALLOC=malloc
。這在對釋出模式下編譯的 Python 使用 Valgrind 等外部記憶體偵錯程式時很有幫助。
出錯時,Python 記憶體分配器的除錯鉤子現在使用 tracemalloc
模組來獲取記憶體塊分配的跟蹤記錄。
使用 python3.6 -X tracemalloc=5
(在跟蹤中儲存 5 個幀)時,緩衝區溢位的致命錯誤示例
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
DTrace 和 SystemTap 探測支援¶
現在可以構建帶有 --with-dtrace
的 Python,這會為直譯器中的以下事件啟用靜態標記
函式呼叫/返回
垃圾回收開始/完成
執行的程式碼行。
這可以用來檢測生產中執行的直譯器,而無需重新編譯特定的 除錯版本 或提供特定於應用程式的分析/除錯程式碼。
有關更多詳細資訊,請參閱 使用 DTrace 和 SystemTap 檢測 CPython。
當前的實現在 Linux 和 macOS 上進行了測試。將來可能會新增其他標記。
(由 Łukasz Langa 在 bpo-21590 中貢獻,基於 Jesús Cea Avión、David Malcolm 和 Nikhil Benesch 的補丁。)
其他語言更改¶
對核心 Python 語言進行的一些較小的更改包括
global
或nonlocal
語句現在必須在同一作用域中受影響名稱的第一次使用之前以文字形式出現。以前,這是一個SyntaxWarning
。現在可以將特殊方法設定為
None
,以指示相應的操作不可用。例如,如果一個類將__iter__()
設定為None
,則該類不可迭代。(由 Andrew Barnert 和 Ivan Levkivskyi 在 bpo-25958 中貢獻。)重複回溯行的長序列現在被縮寫為
"[Previous line repeated {count} more times]"
(有關示例,請參閱 回溯)。(由 Emanuel Barry 在 bpo-26823 中貢獻。)匯入操作現在會在找不到模組時引發新的異常
ModuleNotFoundError
(ImportError
的子類)。當前檢查 ImportError 的程式碼(在 try-except 中)仍將正常工作。(由 Eric Snow 在 bpo-15767 中貢獻。)在類建立期間從元類方法呼叫時,依賴於零引數
super()
的類方法現在可以正常工作。(由 Martin Teichmann 在 bpo-23722 中貢獻。)
新模組¶
secrets¶
新的 secrets
模組的主要目的是提供一種可靠的方式來生成適用於管理金鑰(例如帳戶身份驗證、令牌等)的加密強度高的偽隨機值。
警告
請注意,random
模組中的偽隨機生成器不應用於安全目的。在 Python 3.6+ 上使用 secrets
,在 Python 3.5 及更早版本上使用 os.urandom()
。
另請參閱
- PEP 506 – 向標準庫新增 secrets 模組
PEP 由 Steven D’Aprano 編寫和實現。
改進的模組¶
array¶
array.array
的耗盡迭代器現在即使在迭代陣列被擴充套件時也將保持耗盡狀態。這與其他可變序列的行為一致。
由 Serhiy Storchaka 在 bpo-26492 中貢獻。
ast¶
已新增新的 ast.Constant
AST 節點。外部 AST 最佳化器可以將其用於常量摺疊的目的。
由 Victor Stinner 在 bpo-26146 中貢獻。
asyncio¶
從 Python 3.6 開始,asyncio
模組不再是臨時的,其 API 被認為是穩定的。
自 Python 3.5.0 以來 asyncio
模組中的顯著變化 (由於臨時狀態,所有都向後移植到 3.5.x)
當從協程和回撥中呼叫時,
get_event_loop()
函式已更改為始終返回當前正在執行的迴圈。(由 Yury Selivanov 在 bpo-28613 中貢獻。)ensure_future()
函式以及所有使用它的函式,例如loop.run_until_complete()
,現在接受各種 可等待物件。(由 Yury Selivanov 貢獻。)新的
run_coroutine_threadsafe()
函式,用於從其他執行緒向事件迴圈提交協程。(由 Vincent Michel 貢獻。)新的
Transport.is_closing()
方法,用於檢查傳輸是否正在關閉或已關閉。(由 Yury Selivanov 貢獻。)loop.create_server()
方法現在可以接受主機列表。(由 Yann Sionneau 貢獻。)新的
loop.create_future()
方法用於建立 Future 物件。這允許替代事件迴圈實現,例如 uvloop,提供更快的asyncio.Future
實現。(由 Yury Selivanov 在 bpo-27041 中貢獻。)新的
loop.get_exception_handler()
方法用於獲取當前異常處理程式。(由 Yury Selivanov 在 bpo-27040 中貢獻。)新的
StreamReader.readuntil()
方法用於從流中讀取資料,直到出現分隔符位元組序列。(由 Mark Korenberg 貢獻。)StreamReader.readexactly()
的效能得到了提高。(由 Mark Korenberg 在 bpo-28370 中貢獻。)如果地址已解析,則對
loop.getaddrinfo()
方法進行了最佳化,以避免呼叫系統getaddrinfo
函式。(由 A. Jesse Jiryu Davis 貢獻。)loop.stop()
方法已更改為在當前迭代後立即停止迴圈。作為最後一次迭代的結果而計劃的任何新回撥都將被丟棄。(由 Guido van Rossum 在 bpo-25593 中貢獻。)當傳遞
StopIteration
異常的例項時,Future.set_exception
現在將引發TypeError
。(由 Chris Angelico 在 bpo-26221 中貢獻。)新的
loop.connect_accepted_socket()
方法,供在 asyncio 之外接受連線但使用 asyncio 處理這些連線的伺服器使用。(由 Jim Fulton 在 bpo-27392 中貢獻。)TCP_NODELAY
標誌現在預設設定為所有 TCP 傳輸。(由 Yury Selivanov 在 bpo-27456 中貢獻。)新的
loop.shutdown_asyncgens()
在關閉迴圈之前正確關閉掛起的非同步生成器。(由 Yury Selivanov 在 bpo-28003 中貢獻。)Future
和Task
類現在具有最佳化的 C 實現,這使得 asyncio 程式碼速度提高了 30%。(由 Yury Selivanov 和 INADA Naoki 在 bpo-26081 和 bpo-28544 中貢獻。)
binascii¶
b2a_base64()
函式現在接受一個可選的 *newline* 關鍵字引數,以控制是否將換行符附加到返回值。(由 Victor Stinner 在 bpo-25357 中貢獻。)
cmath¶
添加了新的 cmath.tau
(τ) 常量。(由 Lisa Roach 在 bpo-12345 中貢獻,有關詳細資訊,請參閱 PEP 628 。)
新的常量:cmath.inf
和 cmath.nan
與 math.inf
和 math.nan
匹配,以及 cmath.infj
和 cmath.nanj
與複數 repr 使用的格式匹配。(由 Mark Dickinson 在 bpo-23229 中貢獻。)
collections¶
添加了新的 Collection
抽象基類來表示大小可迭代的容器類。(由 Ivan Levkivskyi 貢獻,Neil Girdhar 在 bpo-27598 中編寫文件。)
新的 Reversible
抽象基類表示也提供 __reversed__()
方法的可迭代類。(由 Ivan Levkivskyi 在 bpo-25987 中貢獻。)
新的 AsyncGenerator
抽象基類表示非同步生成器。(由 Yury Selivanov 在 bpo-28720 中貢獻。)
namedtuple()
函式現在接受一個可選的關鍵字引數 *module*,當指定時,該引數用於返回的命名元組類的 __module__
屬性。(由 Raymond Hettinger 在 bpo-17941 中貢獻。)
namedtuple()
的 *verbose* 和 *rename* 引數現在是僅關鍵字引數。(由 Raymond Hettinger 在 bpo-25628 中貢獻。)
現在可以 pickle 遞迴 collections.deque
例項。(由 Serhiy Storchaka 在 bpo-26482 中貢獻。)
concurrent.futures¶
ThreadPoolExecutor
類建構函式現在接受一個可選的 *thread_name_prefix* 引數,以便自定義池建立的執行緒的名稱。(由 Gregory P. Smith 在 bpo-27664 中貢獻。)
contextlib¶
添加了 contextlib.AbstractContextManager
類,為上下文管理器提供一個抽象基類。它為 __enter__()
提供了合理的預設實現(返回 self
),並將 __exit__()
保留為一個抽象方法。在 typing
模組中添加了一個匹配的類 typing.ContextManager
。(由 Brett Cannon 在 bpo-25609 中貢獻。)
datetime¶
datetime
和 time
類新增了 fold
屬性,用於在必要時消除本地時間的歧義。datetime
中的許多函式都已更新以支援本地時間消除歧義。有關更多資訊,請參見 本地時間消除歧義 部分。(由 Alexander Belopolsky 在 bpo-24773 中貢獻。)
datetime.strftime()
和 date.strftime()
方法現在支援 ISO 8601 日期指令 %G
、%u
和 %V
。(由 Ashley Anderson 在 bpo-12006 中貢獻。)
datetime.isoformat()
函式現在接受一個可選的 timespec 引數,該引數指定要包含的時間值的其他元件的數量。(由 Alessandro Cucci 和 Alexander Belopolsky 在 bpo-19475 中貢獻。)
datetime.combine()
現在接受一個可選的 tzinfo 引數。(由 Alexander Belopolsky 在 bpo-27661 中貢獻。)
decimal¶
新的 Decimal.as_integer_ratio()
方法返回一對整數 (n, d)
,表示給定的 Decimal
例項為一個分數,該分數以最簡形式表示且分母為正數。
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(由 Stefan Krah 和 Mark Dickinson 在 bpo-25928 中貢獻。)
distutils¶
distutils.command.sdist.sdist
中已刪除 default_format
屬性,formats
屬性的預設值設定為 ['gztar']
。儘管沒有預期到,但任何依賴 default_format
存在的程式碼可能需要進行調整。有關更多詳細資訊,請參見 bpo-27819。
email¶
透過 policy 關鍵字啟用新的電子郵件 API(用於各種建構函式)不再是臨時的。email
文件已重新組織和重寫,重點介紹新的 API,同時保留舊版 API 的舊文件。(由 R. David Murray 在 bpo-24277 中貢獻。)
email.mime
類現在都接受可選的 policy 關鍵字。(由 Berker Peksag 在 bpo-27331 中貢獻。)
DecodedGenerator
現在支援 policy 關鍵字。
有一個新的 policy
屬性 message_factory
,用於控制當解析器建立新的訊息物件時預設使用的類。對於 email.policy.compat32
策略,這是 Message
,對於新的策略,則是 EmailMessage
。(由 R. David Murray 在 bpo-20476 中貢獻。)
encodings¶
在 Windows 上,添加了 'oem'
編碼以使用 CP_OEMCP
,以及現有 'mbcs'
編碼的 'ansi'
別名,該編碼使用 CP_ACP
內碼表。(由 Steve Dower 在 bpo-27959 中貢獻。)
enum¶
在 enum
模組中添加了兩個新的列舉基類:Flag
和 IntFlags
。兩者都用於定義可以使用按位運算子組合的常量。(由 Ethan Furman 在 bpo-23591 中貢獻。)
許多標準庫模組已更新為在其常量中使用 IntFlags
類。
新的 enum.auto
值可用於自動為列舉成員賦值。
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
faulthandler¶
在 Windows 上,faulthandler
模組現在為 Windows 異常安裝一個處理程式:請參閱 faulthandler.enable()
。(由 Victor Stinner 在 bpo-23848 中貢獻。)
fileinput¶
hook_encoded()
現在支援 errors 引數。(由 Joseph Hackman 在 bpo-25788 中貢獻。)
hashlib¶
hashlib
支援 OpenSSL 1.1.0。最低建議版本為 1.0.2。(由 Christian Heimes 在 bpo-26470 中貢獻。)
BLAKE2 雜湊函式已新增到模組中。blake2b()
和 blake2s()
始終可用,並支援 BLAKE2 的全部功能。(由 Christian Heimes 在 bpo-26798 中貢獻,基於 Dmitry Chestnykh 和 Samuel Neves 的程式碼。Dmitry Chestnykh 編寫的文件。)
添加了 SHA-3 雜湊函式 sha3_224()
、sha3_256()
、sha3_384()
、sha3_512()
和 SHAKE 雜湊函式 shake_128()
和 shake_256()
。(由 Christian Heimes 在 bpo-16113 中貢獻。Keccak 程式碼包由 Guido Bertoni、Joan Daemen、Michaël Peeters、Gilles Van Assche 和 Ronny Van Keer 提供。)
基於密碼的金鑰派生函式 scrypt()
現在可用於 OpenSSL 1.1.0 及更高版本。(由 Christian Heimes 在 bpo-27928 中貢獻。)
http.client¶
HTTPConnection.request()
和 endheaders()
現在都支援分塊編碼的請求體。(由 Demian Brecht 和 Rolf Krahl 在 bpo-12319 中貢獻。)
idlelib 和 IDLE¶
idlelib 包正在進行現代化和重構,以使 IDLE 看起來和工作起來更好,並使程式碼更易於理解、測試和改進。使 IDLE 看起來更好(尤其是在 Linux 和 Mac 上)的部分工作是使用 ttk 小部件,主要是在對話方塊中。因此,IDLE 不再與 tcl/tk 8.4 一起執行。它現在需要 tcl/tk 8.5 或 8.6。我們建議執行兩者的最新版本。
“現代化”包括重新命名和整合 idlelib 模組。部分大寫名稱檔案的重新命名類似於 3.0 中將 Tkinter 和 TkFont 重新命名為 tkinter 和 tkinter.font。因此,在 3.5 中可以工作的 idlelib 檔案的匯入通常在 3.6 中無法工作。至少需要更改模組名稱(請參閱 idlelib/README.txt),有時還需要更多更改。(由 Al Swiegart 和 Terry Reedy 在 bpo-24225 中貢獻的名稱更改。此後的大部分 idlelib 補丁都將是此過程的一部分。)
作為補償,最終的結果是,一些 idlelib 類將更易於使用,並具有更好的 API 和解釋它們的文件字串。如有,其他有用的資訊將新增到 idlelib 中。
3.6.2 中的新功能
修復了自動完成的多個問題。(由 Louie Lu 在 bpo-15786 中貢獻。)
3.6.3 中的新功能
模組瀏覽器(在“檔案”選單上,以前稱為“類瀏覽器”)現在除了頂級函式和類之外,還顯示巢狀的函式和類。(由 Guilherme Polo、Cheryl Sabella 和 Terry Jan Reedy 在 bpo-1612262 中貢獻。)
以前作為擴充套件實現的 IDLE 功能已重新實現為普通功能。它們的設定已從“擴充套件”選項卡移動到其他對話方塊選項卡。(由 Charles Wohlganger 和 Terry Jan Reedy 在 bpo-27099 中貢獻。)
“設定”對話方塊(“選項”,“配置 IDLE”)已部分重寫,以改進外觀和功能。(由 Cheryl Sabella 和 Terry Jan Reedy 在多個問題中貢獻。)
3.6.4 中的新功能
字型樣本現在包含一些非拉丁字元的選擇,以便使用者可以更好地看到選擇特定字型的效果。(由 Terry Jan Reedy 在 bpo-13802 中貢獻。)可以編輯該樣本以包含其他字元。(由 Serhiy Storchaka 在 bpo-31860 中貢獻。)
3.6.6 中的新功能
修改了編輯器程式碼上下文選項。該框顯示最多 maxlines 的所有上下文行。單擊上下文行會將編輯器跳轉到該行。“設定”對話方塊的“突出顯示”選項卡中添加了自定義主題的上下文顏色。(由 Cheryl Sabella 和 Terry Jan Reedy 在 bpo-33642、bpo-33768 和 bpo-33679 中貢獻。)
在 Windows 上,新的 API 呼叫告訴 Windows tk 為 DPI 縮放。在 Windows 8.1+ 或 10 上,如果 Python 二進位制檔案的 DPI 相容性屬性未更改,並且顯示器解析度大於 96 DPI,則應使文字和線條更清晰。否則,它應該沒有影響。(由 Terry Jan Reedy 在 bpo-33656 中貢獻。)
3.6.7 中的新功能
超過 N 行(預設為 50 行)的輸出會壓縮為一個按鈕。可以在“設定”對話方塊的“常規”頁面的“PyShell”部分中更改 N。可以透過右鍵單擊輸出來壓縮較少但可能超長的行。可以透過雙擊按鈕將壓縮的輸出就地展開,或者透過右鍵單擊按鈕將其展開到剪貼簿或單獨的視窗中。(由 Tal Einat 在 bpo-1529353 中貢獻。)
importlib¶
當無法找到模組時,匯入現在會引發新的異常 ModuleNotFoundError
(ImportError
的子類)。當前檢查 ImportError
的程式碼(在 try-except 中)仍然有效。(由 Eric Snow 在 bpo-15767 中貢獻。)
importlib.util.LazyLoader
現在在包裝的載入器上呼叫 create_module()
,從而消除了 importlib.machinery.BuiltinImporter
和 importlib.machinery.ExtensionFileLoader
不能與 importlib.util.LazyLoader
一起使用的限制。
importlib.util.cache_from_source()
、importlib.util.source_from_cache()
和 importlib.util.spec_from_file_location()
現在接受 路徑類物件。
inspect¶
inspect.signature()
函式現在將編譯器為推導式和生成器表示式作用域生成的隱式 .0
引數報告為就像它們是名為 implicit0
的僅位置引數一樣。(由 Jelle Zijlstra 在 bpo-19611 中貢獻。)
為了減少從 Python 2.7 和舊版 inspect.getargspec()
API 升級時的程式碼變動,之前記錄的 inspect.getfullargspec()
的棄用已被撤銷。雖然此函式對於單個/源 Python 2/3 程式碼庫很方便,但更豐富的 inspect.signature()
介面仍然是新程式碼的推薦方法。(由 Nick Coghlan 在 bpo-27172 中貢獻)
json¶
json.load()
和 json.loads()
現在支援二進位制輸入。編碼的 JSON 應使用 UTF-8、UTF-16 或 UTF-32 表示。(由 Serhiy Storchaka 在 bpo-17909 中貢獻。)
logging¶
添加了新的 WatchedFileHandler.reopenIfNeeded()
方法,以新增檢查日誌檔案是否需要重新開啟的功能。(由 Marian Horban 在 bpo-24884 中貢獻。)
math¶
tau (τ) 常量已新增到 math
和 cmath
模組。(由 Lisa Roach 在 bpo-12345 中貢獻,有關詳細資訊,請參見 PEP 628。)
multiprocessing¶
由 multiprocessing.Manager()
返回的 代理物件 現在可以巢狀。(由 Davin Potts 在 bpo-6766 中貢獻。)
os¶
有關 os
和 os.path
模組現在如何支援 路徑類物件 的詳細資訊,請參見 PEP 519 的摘要。
scandir()
現在支援 Windows 上的 bytes
路徑。
新的 close()
方法允許顯式關閉 scandir()
迭代器。scandir()
迭代器現在支援 上下文管理器 協議。如果 scandir()
迭代器既未耗盡也未顯式關閉,則其解構函式將發出 ResourceWarning
。(由 Serhiy Storchaka 在 bpo-25994 中貢獻。)
在 Linux 上,os.urandom()
現在會阻塞,直到系統 urandom 熵池初始化以提高安全性。請參閱 PEP 524 瞭解其原理。
Linux 的 getrandom()
系統呼叫(獲取隨機位元組)現在以新的 os.getrandom()
函式的形式公開。(由 Victor Stinner 貢獻,是 PEP 524 的一部分)
pathlib¶
pathlib
現在支援 類路徑物件。(由 Brett Cannon 在 bpo-27186 中貢獻。)
有關詳細資訊,請參閱 PEP 519 的摘要。
pdb¶
Pdb
類建構函式有一個新的可選引數 readrc,用於控制是否應讀取 .pdbrc
檔案。
pickle¶
現在可以使用低於協議版本 4 的 pickle 協議 來封送需要使用關鍵字引數呼叫 __new__
的物件。協議版本 4 已經支援這種情況。(由 Serhiy Storchaka 在 bpo-24164 中貢獻。)
pickletools¶
pickletools.dis()
現在為 MEMOIZE
操作碼輸出隱式備忘錄索引。(由 Serhiy Storchaka 在 bpo-25382 中貢獻。)
pydoc¶
pydoc
模組已經學會尊重 MANPAGER
環境變數。(由 Matthias Klose 在 bpo-8637 中貢獻。)
help()
和 pydoc
現在可以按照定義順序而不是字母順序列出具名元組欄位。(由 Raymond Hettinger 在 bpo-24879 中貢獻。)
random¶
新的 choices()
函式返回一個指定大小的元素列表,這些元素來自給定的種群,並具有可選的權重。(由 Raymond Hettinger 在 bpo-18844 中貢獻。)
re¶
在正則表示式中添加了對修飾符跨度的支援。示例:'(?i:p)ython'
匹配 'python'
和 'Python'
,但不匹配 'PYTHON'
;'(?i)g(?-i:v)r'
匹配 'GvR'
和 'gvr'
,但不匹配 'GVR'
。(由 Serhiy Storchaka 在 bpo-433028 中貢獻。)
可以透過 __getitem__
訪問匹配物件組,這等效於 group()
。因此,mo['name']
現在等效於 mo.group('name')
。(由 Eric Smith 在 bpo-24454 中貢獻。)
Match
物件現在支援 類索引 物件
作為組索引。(由 Jeroen Demeyer 和 Xiang Zhang 在 bpo-27177 中貢獻。)
readline¶
添加了 set_auto_history()
來啟用或停用將輸入自動新增到歷史列表。(由 Tyler Crompton 在 bpo-26870 中貢獻。)
rlcompleter¶
現在,除非字首以下劃線開頭,否則會省略私有和特殊屬性名稱。在某些已完成的關鍵字後新增空格或冒號。(由 Serhiy Storchaka 在 bpo-25011 和 bpo-25209 中貢獻。)
shlex¶
透過新的 punctuation_chars 引數來控制哪些字元被視為標點符號,shlex
具有改進的 shell 相容性。(由 Vinay Sajip 在 bpo-1521950 中貢獻。)
site¶
在 .pth
檔案中指定要新增到 sys.path
的路徑時,現在可以在目錄之上指定檔案路徑(例如 zip 檔案)。(由 Wolfgang Langner 在 bpo-26587 中貢獻。)
sqlite3¶
sqlite3.Cursor.lastrowid
現在支援 REPLACE
語句。(由 Alex LordThorsen 在 bpo-16864 中貢獻。)
socket¶
ioctl()
函式現在支援 SIO_LOOPBACK_FAST_PATH
控制碼。(由 Daniel Stokes 在 bpo-26536 中貢獻。)
現在支援 getsockopt()
常量 SO_DOMAIN
、SO_PROTOCOL
、SO_PEERSEC
和 SO_PASSSEC
。(由 Christian Heimes 在 bpo-26907 中貢獻。)
setsockopt()
現在支援 setsockopt(level, optname, None, optlen: int)
形式。(由 Christian Heimes 在 bpo-27744 中貢獻。)
socket 模組現在支援地址族 AF_ALG
,以與 Linux 核心加密 API 介面。ALG_*
、SOL_ALG
和 sendmsg_afalg()
已被新增。(由 Christian Heimes 在 bpo-27744 中貢獻,並得到 Victor Stinner 的支援。)
添加了新的 Linux 常量 TCP_USER_TIMEOUT
和 TCP_CONGESTION
。(由 Omar Sandoval 貢獻,bpo-26273)。
socketserver¶
基於 socketserver
模組的伺服器,包括在 http.server
、xmlrpc.server
和 wsgiref.simple_server
中定義的伺服器,現在支援 上下文管理器 協議。(由 Aviv Palivoda 在 bpo-26404 中貢獻。)
StreamRequestHandler
類的 wfile
屬性現在實現了 io.BufferedIOBase
可寫介面。特別是,現在保證呼叫 write()
會完整發送資料。(由 Martin Panter 在 bpo-26721 中貢獻。)
ssl¶
ssl
支援 OpenSSL 1.1.0。建議的最低版本為 1.0.2。(由 Christian Heimes 在 bpo-26470 中貢獻。)
3DES 已從預設密碼套件中刪除,並添加了 ChaCha20 Poly1305 密碼套件。(由 Christian Heimes 在 bpo-27850 和 bpo-27766 中貢獻。)
SSLContext
具有更好的選項和密碼預設配置。(由 Christian Heimes 在 bpo-28043 中貢獻。)
可以使用新的 SSLSession
類將 SSL 會話從一個客戶端連線複製到另一個客戶端連線。TLS 會話恢復可以加速初始握手,減少延遲並提高效能(由 Christian Heimes 在 bpo-19500 中基於 Alex Warhawk 的草案貢獻。)
可以使用新的 get_ciphers()
方法按密碼優先順序順序獲取已啟用密碼的列表。
所有常量和標誌都已轉換為 IntEnum
和 IntFlags
。(由 Christian Heimes 在 bpo-28025 中貢獻。)
為 SSLContext
添加了伺服器端和客戶端特定的 TLS 協議。(由 Christian Heimes 在 bpo-28085 中貢獻。)
添加了 ssl.SSLContext.post_handshake_auth
以啟用,以及 ssl.SSLSocket.verify_client_post_handshake()
以啟動 TLS 1.3 後握手身份驗證。(由 Christian Heimes 在 gh-78851 中貢獻。)
statistics¶
添加了新的 harmonic_mean()
函式。(由 Steven D’Aprano 在 bpo-27181 中貢獻。)
struct¶
struct
現在透過 'e'
格式說明符支援 IEEE 754 半精度浮點數。(由 Eli Stevens、Mark Dickinson 在 bpo-11734 中貢獻。)
subprocess¶
如果子程序仍在執行,則 subprocess.Popen
的解構函式現在會發出 ResourceWarning
警告。請使用上下文管理器協議(with proc: ...
)或顯式呼叫 wait()
方法來讀取子程序的退出狀態。(由 Victor Stinner 在 bpo-26741 中貢獻。)
subprocess.Popen
建構函式和所有透過它傳遞引數的函式現在接受 encoding 和 errors 引數。指定其中任何一個都會為 stdin、stdout 和 stderr 流啟用文字模式。(由 Steve Dower 在 bpo-6135 中貢獻。)
sys¶
新的 getfilesystemencodeerrors()
函式返回用於在 Unicode 檔名和位元組檔名之間轉換的錯誤模式的名稱。(由 Steve Dower 在 bpo-27781 中貢獻。)
在 Windows 上,getwindowsversion()
函式的返回值現在包含 platform_version 欄位,該欄位包含當前作業系統的準確主版本號、次版本號和內部版本號,而不是為該程序模擬的版本(由 Steve Dower 在 bpo-27932 中貢獻。)
telnetlib¶
telnetlib.Telnet
現在是一個上下文管理器(由 Stéphane Wirtel 在 bpo-25485 中貢獻)。
time¶
現在在所有平臺上都可以使用 struct_time
屬性 tm_gmtoff
和 tm_zone
。
timeit¶
添加了新的 Timer.autorange()
便利方法,用於重複呼叫 Timer.timeit()
,以便總執行時間大於或等於 200 毫秒。(由 Steven D’Aprano 在 bpo-6422 中貢獻。)
當最佳時間和最差時間之間存在較大(4 倍)差異時,timeit
現在會發出警告。(由 Serhiy Storchaka 在 bpo-23552 中貢獻。)
tkinter¶
在 tkinter.Variable
類中添加了方法 trace_add()
、trace_remove()
和 trace_info()
。它們取代了使用過時的 Tcl 命令的舊方法 trace_variable()
、trace()
、trace_vdelete()
和 trace_vinfo()
,這些方法在未來版本的 Tcl 中可能無法正常工作。(由 Serhiy Storchaka 在 bpo-22115 中貢獻。)
traceback¶
回溯模組和直譯器的內建異常顯示現在都會縮短回溯中重複行的長序列,如下例所示
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(由 Emanuel Barry 在 bpo-26823 中貢獻。)
tracemalloc¶
tracemalloc
模組現在支援跟蹤多個不同地址空間中的記憶體分配。
新增了 DomainFilter
過濾器類,用於按地址空間(域)過濾塊跟蹤。
(由 Victor Stinner 在 bpo-26588 中貢獻。)
typing¶
由於 typing
模組是臨時的,因此 Python 3.6 中引入的所有更改也都向後移植到了 Python 3.5.x。
typing
模組對泛型類型別名的支援得到了極大改進。例如,Dict[str, Tuple[S, T]]
現在是一個有效的型別註解。(由 Guido van Rossum 在 Github #195 中貢獻。)
添加了 typing.ContextManager
類,用於表示 contextlib.AbstractContextManager
。(由 Brett Cannon 在 bpo-25609 中貢獻。)
添加了 typing.Collection
類,用於表示 collections.abc.Collection
。(由 Ivan Levkivskyi 在 bpo-27598 中貢獻。)
添加了 typing.ClassVar
型別構造,用於標記類變數。如 PEP 526 中介紹的那樣,用 ClassVar 包裹的變數註解表明給定屬性旨在用作類變數,並且不應在類的例項上設定。(由 Ivan Levkivskyi 在 Github #280 中貢獻。)
新增了一個 TYPE_CHECKING
常量,靜態型別檢查器假定該常量為 True
,但在執行時為 False
。(由 Guido van Rossum 在 Github #230 中貢獻。)
新增了 NewType()
輔助函式,用於為註解建立輕量級、獨特的型別
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
靜態型別檢查器會將新型別視為原始型別的子類。(由 Ivan Levkivskyi 在 Github #189 中貢獻。)
unicodedata¶
unicodedata
模組現在使用來自 Unicode 9.0.0 的資料。(由 Benjamin Peterson 貢獻。)
unittest.mock¶
Mock
類有以下改進
兩個新方法:
Mock.assert_called()
和Mock.assert_called_once()
,用於檢查是否呼叫了模擬物件。(由 Amit Saha 在 bpo-26323 中貢獻。)Mock.reset_mock()
方法現在有兩個可選的僅關鍵字引數:return_value 和 side_effect。(由 Kushal Das 在 bpo-21271 中貢獻。)
urllib.request¶
如果 HTTP 請求具有檔案或可迭代的 body(而不是位元組物件),但沒有 Content-Length
標頭,則 AbstractHTTPHandler
現在會回退使用分塊傳輸編碼,而不是丟擲錯誤。(由 Demian Brecht 和 Rolf Krahl 在 bpo-12319 中貢獻。)
urllib.robotparser¶
RobotFileParser
現在支援 Crawl-delay
和 Request-rate
擴充套件。(由 Nikolay Bogoychev 在 bpo-16099 中貢獻。)
venv¶
venv
接受一個新引數 --prompt
。此引數為虛擬環境提供了一個備選字首。(由 Łukasz Balcerzak 提出,並由 Stéphane Wirtel 移植到 3.6,見 bpo-22829。)
warnings¶
向 warnings.warn_explicit()
函式添加了一個新的可選 source 引數:發出 ResourceWarning
的已銷燬物件。還向 warnings.WarningMessage
添加了一個 source 屬性(由 Victor Stinner 在 bpo-26568 和 bpo-26567 中貢獻)。
當記錄 ResourceWarning
警告時,現在使用 tracemalloc
模組嘗試檢索已銷燬物件的分配位置的回溯。
使用指令碼 example.py
的示例
import warnings
def func():
return open(__file__)
f = func()
f = None
命令 python3.6 -Wd -X tracemalloc=5 example.py
的輸出
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
“Object allocated at” 回溯是新的,僅當 tracemalloc
正在跟蹤 Python 記憶體分配,並且已匯入 warnings
模組時才會顯示。
winreg¶
winsound¶
允許將關鍵字引數傳遞給 Beep
、MessageBeep
和 PlaySound
(bpo-27982)。
xmlrpc.client¶
xmlrpc.client
模組現在支援解組 Apache XML-RPC 實現用於數值和 None
的其他資料型別。(由 Serhiy Storchaka 在 bpo-26885 中貢獻。)
zipfile¶
新的 ZipInfo.from_file()
類方法允許從檔案系統檔案建立 ZipInfo
例項。新的 ZipInfo.is_dir()
方法可用於檢查 ZipInfo
例項是否表示目錄。(由 Thomas Kluyver 在 bpo-26039 中貢獻。)
現在,ZipFile.open()
方法既可以用來將資料寫入 ZIP 檔案,也可以用來提取資料。(由 Thomas Kluyver 在 bpo-26039 中貢獻。)
zlib¶
現在,compress()
和 decompress()
函式接受關鍵字引數。(由 Aviv Palivoda 在 bpo-26243 中貢獻,以及 Xiang Zhang 在 bpo-16764 中貢獻。)
最佳化¶
Python 直譯器現在使用 16 位字碼而不是位元組碼,這使得許多操作碼最佳化成為可能。(由 Demur Rumed 貢獻,並由 Serhiy Storchaka 和 Victor Stinner 提供輸入和審查,分別在 bpo-26647 和 bpo-28050 中。)
現在,
asyncio.Future
類有一個最佳化的 C 實現。(由 Yury Selivanov 和 INADA Naoki 在 bpo-26081 中貢獻。)現在,
asyncio.Task
類有一個最佳化的 C 實現。(由 Yury Selivanov 在 bpo-28544 中貢獻。)typing
模組中的各種實現改進(例如泛型型別的快取)允許效能提高高達 30 倍,並減少記憶體佔用。對於錯誤處理程式
surrogateescape
、ignore
和replace
,ASCII 解碼器現在的速度提高了 60 倍(由 Victor Stinner 在 bpo-24870 中貢獻)。對於錯誤處理程式
surrogateescape
,ASCII 和 Latin1 編碼器現在的速度提高了 3 倍(由 Victor Stinner 在 bpo-25227 中貢獻)。對於錯誤處理程式
ignore
、replace
、surrogateescape
和surrogatepass
,UTF-8 編碼器現在的速度提高了 75 倍(由 Victor Stinner 在 bpo-25267 中貢獻)。對於錯誤處理程式
ignore
、replace
和surrogateescape
,UTF-8 解碼器現在的速度提高了 15 倍(由 Victor Stinner 在 bpo-25301 中貢獻)。bytes % args
現在速度提高了 2 倍。(由 Victor Stinner 在 bpo-25349 中貢獻)。bytearray % args
現在速度提高了 2.5 到 5 倍。(由 Victor Stinner 在 bpo-25399 中貢獻)。優化了
bytes.fromhex()
和bytearray.fromhex()
:它們現在的速度提高了 2 倍到 3.5 倍。(由 Victor Stinner 在 bpo-25401 中貢獻)。優化了
bytes.replace(b'', b'.')
和bytearray.replace(b'', b'.')
:速度提高了 80%。(由 Josh Snider 在 bpo-26574 中貢獻)。PyMem_Malloc()
域 (PYMEM_DOMAIN_MEM
) 的分配器函式現在使用 pymalloc 記憶體分配器,而不是 C 庫的malloc()
函式。 pymalloc 分配器針對小於或等於 512 位元組且生命週期短的物件進行了最佳化,並對較大的記憶體塊使用malloc()
。(由 Victor Stinner 在 bpo-26249 中貢獻)。當反序列化許多小物件時,
pickle.load()
和pickle.loads()
現在速度提高了 10%(由 Victor Stinner 在 bpo-27056 中貢獻)。與傳遞位置引數相比,向函式傳遞關鍵字引數會產生開銷。現在,在使用 Argument Clinic 實現的擴充套件函式中,此開銷已大大減少。(由 Serhiy Storchaka 在 bpo-27574 中貢獻)。
優化了
glob()
和iglob()
函式,它們現在速度提高了大約 3-6 倍。(由 Serhiy Storchaka 在 bpo-25596 中貢獻)。透過使用
os.scandir()
,優化了pathlib
中的 globbing;現在速度提高了大約 1.5-4 倍。(由 Serhiy Storchaka 在 bpo-26032 中貢獻)。xml.etree.ElementTree
的解析、迭代和深複製效能得到了顯著提高。(由 Serhiy Storchaka 在 bpo-25638、bpo-25873 和 bpo-25869 中貢獻。)從浮點數和小數建立
fractions.Fraction
例項現在速度提高了 2 到 3 倍。(由 Serhiy Storchaka 在 bpo-25971 中貢獻)。
構建和 C API 更改¶
Python 現在需要工具鏈中的一些 C99 支援才能構建。 最值得注意的是,Python 現在使用標準整數型別和宏來代替自定義宏,例如
PY_LONG_LONG
。 有關更多資訊,請參閱 PEP 7 和 bpo-17884。使用 Android NDK 和 Android API 級別設定為 21(Android 5.0 Lollipop)或更高版本交叉編譯 CPython 成功執行。 雖然 Android 尚未成為受支援的平臺,但 Python 測試套件在 Android 模擬器上執行,只有大約 16 個測試失敗。 請參閱 Android 元問題 bpo-26865。
添加了
--enable-optimizations
配置標誌。 啟用它將啟用諸如 PGO 之類的昂貴最佳化。(由英特爾的 Alecsandru Patrascu 在 bpo-26359 中提供的原始補丁。)現在,當呼叫
PYMEM_DOMAIN_OBJ
(例如:PyObject_Malloc()
) 和PYMEM_DOMAIN_MEM
(例如:PyMem_Malloc()
) 域的分配器函式時,必須持有 GIL。新增
Py_FinalizeEx()
API,用於指示重新整理緩衝資料是否失敗。(由 Martin Panter 在 bpo-5319 中貢獻。)PyArg_ParseTupleAndKeywords()
現在支援僅限位置引數。僅限位置引數由空名稱定義。(由 Serhiy Storchaka 在 bpo-26282 中貢獻)。PyTraceback_Print
方法現在將重複行的長序列縮寫為"[Previous line repeated {count} more times]"
。(由 Emanuel Barry 在 bpo-26823 中貢獻。)新的
PyErr_SetImportErrorSubclass()
函式允許指定要引發的ImportError
的子類。(由 Eric Snow 在 bpo-15767 中貢獻。)新的
PyErr_ResourceWarning()
函式可用於生成ResourceWarning
,並提供資源分配的來源。(由 Victor Stinner 在 bpo-26567 中貢獻。)新的
PyOS_FSPath()
函式返回 path-like object 的檔案系統表示形式。(由 Brett Cannon 在 bpo-27186 中貢獻。)PyUnicode_FSConverter()
和PyUnicode_FSDecoder()
函式現在將接受類路徑物件。
其他改進¶
當
--version
(短形式:-V
) 被提供兩次時,Python 會列印sys.version
以獲取詳細資訊。$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
已棄用¶
新關鍵字¶
async
和 await
不建議用作變數、類、函式或模組名。由 PEP 492 在 Python 3.5 中引入,它們將在 Python 3.7 中成為正式關鍵字。從 Python 3.6 開始,使用 async
或 await
作為名稱將生成 DeprecationWarning
。
已棄用的 Python 行為¶
在生成器內部引發 StopIteration
異常現在將生成 DeprecationWarning
,並且在 Python 3.7 中將觸發 RuntimeError
。 有關詳細資訊,請參閱 PEP 479: 更改生成器內部的 StopIteration 處理。
現在期望 __aiter__()
方法直接返回非同步迭代器,而不是像以前那樣返回可等待物件。執行前者將觸發 DeprecationWarning
。向後相容性將在 Python 3.7 中刪除。(由 Yury Selivanov 在 bpo-27243 中貢獻。)
現在,不是有效轉義序列的反斜槓字元對會生成 DeprecationWarning
。雖然這最終會變成 SyntaxError
,但這不會在幾個 Python 版本中實現。(由 Emanuel Barry 在 bpo-27364 中貢獻。)
在執行相對匯入時,當 __spec__
或 __package__
未定義時,回退到呼叫模組的 __name__
和 __path__
現在會引發 ImportWarning
。(由 Rose Ames 在 bpo-25791 中貢獻。)
已棄用的 Python 模組、函式和方法¶
asynchat¶
asyncore¶
dbm¶
與其他 dbm
實現不同,dbm.dumb
模組使用 'rw'
模式建立資料庫,並允許修改以 'r'
模式開啟的資料庫。此行為現在已棄用,並將在 3.8 中刪除。(由 Serhiy Storchaka 在 bpo-21708 中貢獻。)
distutils¶
distutils.Distribution
建構函式的未文件化引數 extra_path
現在被視為已棄用,如果設定了該引數,則會引發警告。對該引數的支援將在未來的 Python 版本中刪除。有關詳細資訊,請參閱 bpo-27919。
grp¶
已棄用 getgrgid()
中對非整數引數的支援。(由 Serhiy Storchaka 在 bpo-26129 中貢獻。)
importlib¶
importlib.machinery.SourceFileLoader.load_module()
和 importlib.machinery.SourcelessFileLoader.load_module()
方法現在已棄用。它們是 importlib.abc.Loader.load_module()
在 importlib
中唯一剩餘的實現,而在以前的 Python 版本中,這些實現尚未棄用,而是推薦使用 importlib.abc.Loader.exec_module()
。
importlib.machinery.WindowsRegistryFinder
類現在已棄用。從 3.6.0 開始,它仍然預設新增到 sys.meta_path
(在 Windows 上),但這可能會在未來的版本中更改。
os¶
現在已棄用 os
函式,compile()
和類似函式中對作為路徑的通用 類位元組物件 的未文件化支援。(由 Serhiy Storchaka 在 bpo-25791 和 bpo-26754 中貢獻。)
re¶
已棄用對正則表示式中間內聯標誌 (?letters)
的支援,並將在未來的 Python 版本中刪除。仍然允許在正則表示式開頭使用標誌。(由 Serhiy Storchaka 在 bpo-22493 中貢獻。)
ssl¶
OpenSSL 0.9.8、1.0.0 和 1.0.1 已棄用且不再受支援。未來,ssl
模組將至少需要 OpenSSL 1.0.2 或 1.1.0。
諸如 certfile
、keyfile
和 check_hostname
等與 SSL 相關的引數,在 ftplib
、http.client
、imaplib
、poplib
和 smtplib
中已被棄用,建議改用 context
。(由 Christian Heimes 在 bpo-28022 中貢獻。)
ssl
模組的幾個協議和函式現在已棄用。某些功能在未來的 OpenSSL 版本中將不再可用。其他功能已被棄用,建議改用不同的 API。(由 Christian Heimes 在 bpo-28022 和 bpo-26470 中貢獻。)
tkinter¶
現在已棄用 tkinter.tix
模組。tkinter
使用者應改用 tkinter.ttk
。
venv¶
已棄用 pyvenv
指令碼,建議使用 python3 -m venv
。這可以避免 pyvenv
連線到哪個 Python 直譯器的混淆,從而避免虛擬環境使用哪個 Python 直譯器的混淆。(由 Brett Cannon 在 bpo-25154 中貢獻。)
xml¶
作為對 DTD 和外部實體檢索的緩解措施,
xml.dom.minidom
和xml.sax
模組預設不再處理外部實體。(由 Christian Heimes 在 gh-61441 中貢獻。)
已棄用的 C API 函式和型別¶
未記錄的函式 PyUnicode_AsEncodedObject()
、PyUnicode_AsDecodedObject()
、PyUnicode_AsEncodedUnicode()
和 PyUnicode_AsDecodedUnicode()
現在已棄用。請改用 基於通用編解碼器的 API。
已棄用的構建選項¶
在非 macOS UNIX 平臺上,--with-system-ffi
配置標誌現在預設啟用。可以使用 --without-system-ffi
停用它,但使用該標誌已被棄用,並且在 Python 3.7 中將不被接受。macOS 不受此更改的影響。請注意,許多作業系統發行商在構建其系統 Python 時已經使用了 --with-system-ffi
標誌。
已移除¶
API 和功能移除¶
在正則表示式中,由
'\'
和一個 ASCII 字母組成的未知轉義符現在將導致錯誤。在re.sub()
的替換模板中,仍然允許使用它們,但已棄用。re.LOCALE
標誌現在只能與二進位制模式一起使用。刪除了
inspect.getmoduleinfo()
(自 CPython 3.3 起已棄用)。應該使用inspect.getmodulename()
獲取給定路徑的模組名稱。(由 Yury Selivanov 在 bpo-13248 中貢獻。)從
traceback
模組中刪除了traceback.Ignore
類和traceback.usage
、traceback.modname
、traceback.fullmodname
、traceback.find_lines_from_code
、traceback.find_lines
、traceback.find_strings
、traceback.find_executable_lines
方法。它們是自 Python 3.2 起已棄用的未記錄方法,並且可以從私有方法獲得等效功能。刪除了
tkinter
視窗小部件類中的tk_menuBar()
和tk_bindForTraversal()
虛擬方法(相應的 Tk 命令自 Tk 4.0 起已過時)。zipfile.ZipFile
類的open()
方法不再支援'U'
模式(自 Python 3.4 起已棄用)。請使用io.TextIOWrapper
以 通用換行符 模式讀取壓縮的文字檔案。刪除了未記錄的
IN
、CDROM
、DLFCN
、TYPES
、CDIO
和STROPTS
模組。它們曾存在於特定於平臺的Lib/plat-*/
目錄中,但長期過時、在不同平臺上的可用性不一致且未維護。建立這些模組的指令碼仍然可以在原始碼發行版的 Tools/scripts/h2py.py 中找到。刪除了已棄用的
asynchat.fifo
類。
移植到 Python 3.6¶
本節列出了前面描述的更改和其他可能需要更改程式碼的錯誤修復。
“python”命令列為的更改¶
現在預設關閉使用定義的
COUNT_ALLOCS
、SHOW_ALLOC_COUNT
或SHOW_TRACK_COUNT
宏的特殊 Python 構建的輸出。可以使用-X showalloccount
選項重新啟用它。現在輸出到stderr
而不是stdout
。(由 Serhiy Storchaka 在 bpo-23034 中貢獻。)
Python API 的更改¶
open()
將不再允許將'U'
模式標誌與'+'
組合使用。(由 Jeff Balogh 和 John O’Connor 在 bpo-2091 中貢獻。)sqlite3
在執行 DDL 語句之前,不再隱式提交開啟的事務。在 Linux 上,
os.urandom()
現在會阻塞,直到系統 urandom 熵池初始化完畢,以提高安全性。當定義了
importlib.abc.Loader.exec_module()
時,也必須定義importlib.abc.Loader.create_module()
。當 msg 引數未設定時,
PyErr_SetImportError()
現在會設定TypeError
。之前只返回NULL
。程式碼物件的
co_lnotab
屬性的格式已更改,以支援負行號增量。預設情況下,Python 不會發出帶有負行號增量的位元組碼。使用frame.f_lineno
、PyFrame_GetLineNumber()
或PyCode_Addr2Line()
的函式不受影響。直接解碼co_lnotab
的函式應更新為對行號增量使用有符號的 8 位整數型別,但這僅在支援使用負行號增量的應用程式時才是必需的。請參閱Objects/lnotab_notes.txt
獲取co_lnotab
的格式以及如何解碼它,並參閱 PEP 511 瞭解其基本原理。compileall
模組中的函式現在返回布林值而不是1
或0
來表示成功或失敗。由於布林值是整數的子類,因此如果您執行1
或0
的身份檢查,這才會成為問題。請參閱 bpo-25768。讀取
urllib.parse.urlsplit()
和urlparse()
的port
屬性現在會為超出範圍的值引發ValueError
,而不是返回None
。請參閱 bpo-20059。imp
模組現在引發DeprecationWarning
而不是PendingDeprecationWarning
。以下模組已在其
__all__
屬性中添加了缺少的 API,以匹配文件化的 API:calendar
,cgi
,csv
,ElementTree
,enum
,fileinput
,ftplib
,logging
,mailbox
,mimetypes
,optparse
,plistlib
,smtpd
,subprocess
,tarfile
,threading
和wave
。這意味著當使用import *
時,它們將匯出新的符號。(由 Joel Taddei 和 Jacek Kołodziej 在 bpo-23883 中貢獻。)當執行相對匯入時,如果
__package__
與__spec__.parent
不相等,則會引發ImportWarning
。(由 Brett Cannon 在 bpo-25791 中貢獻。)當執行相對匯入且沒有已知父包時,將引發
ImportError
。以前,可能會引發SystemError
。(由 Brett Cannon 在 bpo-18018 中貢獻。)基於
socketserver
模組的伺服器,包括在http.server
、xmlrpc.server
和wsgiref.simple_server
中定義的伺服器,現在只捕獲派生自Exception
的異常。 因此,如果請求處理程式引發諸如SystemExit
或KeyboardInterrupt
的異常,則不再呼叫handle_error()
,並且該異常將停止單執行緒伺服器。(由 Martin Panter 在 bpo-23430 中貢獻。)spwd.getspnam()
現在如果使用者沒有許可權,則會引發PermissionError
,而不是KeyError
。如果底層系統呼叫報告錯誤(例如
EBADF
),則socket.socket.close()
方法現在會引發異常。(由 Martin Panter 在 bpo-26685 中貢獻。)smtpd.SMTPChannel
和smtpd.SMTPServer
建構函式的 decode_data 引數現在預設為False
。 這意味著傳遞給process_message()
的引數現在預設為位元組物件,並且將向process_message()
傳遞關鍵字引數。 已經根據 3.5 生成的棄用警告更新的程式碼不會受到影響。dump()
、dumps()
、load()
和loads()
函式以及JSONEncoder
和JSONDecoder
類建構函式在json
模組中的所有可選引數現在都是僅限關鍵字的。(由 Serhiy Storchaka 在 bpo-18726 中貢獻。)不覆蓋
type.__new__
的type
的子類可能不再使用單引數形式來獲取物件的型別。作為 PEP 487 的一部分,傳遞給
type
(除了元類提示metaclass
之外)的關鍵字引數的處理現在一致地委託給object.__init_subclass__()
。 這意味著type.__new__()
和type.__init__()
現在都接受任意關鍵字引數,但object.__init_subclass__()
(從type.__new__()
呼叫)預設情況下會拒絕它們。 接受其他關鍵字引數的自定義元類將需要相應地調整它們對type.__new__()
的呼叫(無論是直接呼叫還是透過super
呼叫)。在
distutils.command.sdist.sdist
中,default_format
屬性已被刪除,不再被使用。 相反,gzipped tarfile 格式是所有平臺上的預設格式,並且不會進行特定於平臺的選擇。 在 Windows 上構建發行版並且需要 zip 發行版的環境中,請使用包含以下內容的setup.cfg
檔案配置專案[sdist] formats=zip
此行為也已透過 Setuptools 26.0.0 反向移植到較早的 Python 版本。
在
urllib.request
模組和http.client.HTTPConnection.request()
方法中,如果沒有指定 Content-Length 標頭欄位,並且請求正文是檔案物件,則現在使用 HTTP 1.1 分塊編碼傳送。 如果必須將檔案物件傳送到 HTTP 1.0 伺服器,則現在必須由呼叫方指定 Content-Length 值。(由 Demian Brecht 和 Rolf Krahl 貢獻,Martin Panter 進行了調整,參見 bpo-12319。)DictReader
現在返回OrderedDict
型別的行。(由 Steve Holden 在 bpo-27842 中貢獻。)如果平臺不支援,則不再將
crypt.METHOD_CRYPT
新增到crypt.methods
中。(由 Victor Stinner 在 bpo-25287 中貢獻。)namedtuple()
的 *verbose* 和 *rename* 引數現在是僅關鍵字引數。(由 Raymond Hettinger 在 bpo-25628 中貢獻。)在 Linux 上,
ctypes.util.find_library()
現在在LD_LIBRARY_PATH
中查詢共享庫。(由 Vinay Sajip 在 bpo-9998 中貢獻。)imaplib.IMAP4
類現在處理從伺服器傳送的訊息中包含']'
字元的標誌,以提高實際相容性。(由 Lita Cho 在 bpo-21815 中貢獻。)mmap.write()
函式現在像其他寫入方法一樣返回寫入的位元組數。(由 Jakub Stasiak 在 bpo-26335 中貢獻。)pkgutil.iter_modules()
和pkgutil.walk_packages()
函式現在返回ModuleInfo
命名元組。(由 Ramchandra Apte 在 bpo-17211 中貢獻。)re.sub()
現在即使在字串中未找到模式,也會為替換模板中的無效數字組引用引發錯誤。 無效組引用的錯誤訊息現在包括組索引和引用的位置。(由 SilentGhost,Serhiy Storchaka 在 bpo-25953 中貢獻。)zipfile.ZipFile
現在對於無法識別的壓縮值會引發NotImplementedError
異常。 之前會引發普通的RuntimeError
異常。 此外,在已關閉的 ZipFile 上呼叫ZipFile
方法,或在以模式'r'
建立的 ZipFile 上呼叫write()
方法時,會引發ValueError
異常。 之前在這些情況下會引發RuntimeError
異常。當自定義元類與無引數的
super()
或從方法到隱式的__class__
閉包變數的直接引用結合使用時,隱式的__classcell__
名稱空間條目現在必須傳遞給type.__new__
進行初始化。 如果不這樣做,在 Python 3.6 中將導致DeprecationWarning
,而在 Python 3.8 中將導致RuntimeError
。隨著
ModuleNotFoundError
的引入,匯入系統使用者可能會開始期望匯入系統替換在適當的時候引發更具體的異常,而不是不太具體的ImportError
。 為了與此類使用者提供未來的相容性,完全替換__import__()
的替代匯入系統的實現者需要更新其實現,以便在根本找不到模組時引發新的子類。 預設匯入系統的相容外掛的實現者不需要進行任何更改,因為預設匯入系統會在適當的時候引發新的子類。
C API 中的更改¶
PyMem_Malloc()
分配器系列現在使用 pymalloc 分配器,而不是系統malloc()
。 在沒有持有 GIL 的情況下呼叫PyMem_Malloc()
的應用程式現在可能會崩潰。 將PYTHONMALLOC
環境變數設定為debug
以驗證應用程式中記憶體分配器的使用情況。 請參閱 bpo-26249。如果重新整理緩衝資料失敗,
Py_Exit()
(和主直譯器) 現在會將退出狀態覆蓋為 120。請參閱 bpo-5319。
CPython 位元組碼更改¶
Python 3.6 中的 位元組碼 發生了一些重大更改。
Python 直譯器現在使用 16 位字碼而不是位元組碼。(由 Demur Rumed 貢獻,並由 Serhiy Storchaka 和 Victor Stinner 在 bpo-26647 和 bpo-28050 中提供輸入和審查。)
作為 格式化字串字面量 實現的一部分,新的
FORMAT_VALUE
和BUILD_STRING
操作碼。(由 Eric Smith 在 bpo-25483 中貢獻,Serhiy Storchaka 在 bpo-27078 中貢獻。)新的
BUILD_CONST_KEY_MAP
操作碼用於最佳化具有常量鍵的字典的建立。(由 Serhiy Storchaka 在 bpo-27140 中貢獻。)為了獲得更好的效能和更簡單的實現,函式呼叫操作碼已經過大量修改。
MAKE_FUNCTION
,CALL_FUNCTION
,CALL_FUNCTION_KW
和BUILD_MAP_UNPACK_WITH_CALL
操作碼已修改,添加了新的CALL_FUNCTION_EX
和BUILD_TUPLE_UNPACK_WITH_CALL
,並移除了CALL_FUNCTION_VAR
、CALL_FUNCTION_VAR_KW
和MAKE_CLOSURE
操作碼。(由 Demur Rumed 在 bpo-27095 中貢獻,Serhiy Storchaka 在 bpo-27213, bpo-28257 中貢獻。)為了支援新的 變數註解 語法,添加了新的
SETUP_ANNOTATIONS
和STORE_ANNOTATION
操作碼。(由 Ivan Levkivskyi 在 bpo-27985 中貢獻。)
Python 3.6.2 中的顯著變化¶
新的 make regen-all
構建目標¶
為了簡化交叉編譯,並確保 CPython 可以在無需現有可用 Python 版本的情況下可靠地編譯,基於 autotools 的構建系統不再嘗試基於檔案修改時間隱式地重新編譯生成的檔案。
相反,添加了一個新的 make regen-all
命令,以便在需要時強制重新生成這些檔案(例如,在基於預生成的版本已經構建了 Python 的初始版本之後)。
還定義了更多有選擇性的重新生成目標 - 有關詳細資訊,請參閱 Makefile.pre.in。
(由 Victor Stinner 在 bpo-23404 中貢獻。)
在 3.6.2 版本中新增。
刪除 make touch
構建目標¶
之前用於透過更新修改時間來請求隱式重新生成生成檔案的 make touch
構建目標已被刪除。
它已被新的 make regen-all
目標所取代。
(由 Victor Stinner 在 bpo-23404 中貢獻。)
在 3.6.2 版本中更改。
Python 3.6.4 中的顯著變化¶
作為公共 API 一部分的 PyExc_RecursionErrorInst
單例已被刪除,因為其成員從不清空可能會導致直譯器最終確定期間出現段錯誤。(由 Xavier de Gaye 在 bpo-22898 和 bpo-30697 中貢獻。)
Python 3.6.5 中的顯著變化¶
現在,locale.localeconv()
函式在某些情況下會臨時將 LC_CTYPE
區域設定設定為 LC_NUMERIC
區域設定。(由 Victor Stinner 在 bpo-31900 中貢獻。)
Python 3.6.7 中的顯著變化¶
xml.dom.minidom
和 xml.sax
模組預設不再處理外部實體。另請參閱 gh-61441。
在 3.6.7 中,tokenize
模組現在會在輸入不包含尾隨換行符時隱式發出 NEWLINE
標記。此行為現在與 C 標記器在內部執行的操作相匹配。(由 Ammar Askar 在 bpo-33899 中貢獻。)
Python 3.6.10 中的顯著變化¶
由於重大的安全問題,不再支援 asyncio.loop.create_datagram_endpoint()
的 reuse_address 引數。這是由於 UDP 中套接字選項 SO_REUSEADDR
的行為。有關更多詳細資訊,請參閱 loop.create_datagram_endpoint()
的文件。(由 Kyle Stanley、Antoine Pitrou 和 Yury Selivanov 在 bpo-37228 中貢獻。)
Python 3.6.13 中的顯著變化¶
早期版本的 Python 允許在 urllib.parse.parse_qs()
和 urllib.parse.parse_qsl()
中使用 ;
和 &
作為查詢引數分隔符。由於安全問題,併為了符合較新的 W3C 建議,此項已更改為僅允許單個分隔符鍵,預設情況下使用 &
。此更改還會影響 cgi.parse()
和 cgi.parse_multipart()
,因為它們在內部使用了受影響的函式。有關更多詳細資訊,請參閱它們各自的文件。(由 Adam Goldschmidt、Senthil Kumaran 和 Ken Jin 在 bpo-42967 中貢獻。)
Python 3.6.14 中的顯著變化¶
一個安全修復程式更改了 ftplib.FTP
的行為,在設定被動資料通道時不信任來自遠端伺服器的 IPv4 地址。我們改為重用 ftp 伺服器 IP 地址。對於需要舊行為的異常程式碼,請將 FTP 例項上的 trust_server_pasv_ipv4_address
屬性設定為 True
。(請參閱 gh-87451)
URL 部分中存在換行符或製表符允許進行某些形式的攻擊。按照更新 RFC 3986 的 WHATWG 規範,解析器 urllib.parse()
會從 URL 中剝離 ASCII 換行符 \n
、\r
和製表符 \t
字元,從而防止此類攻擊。刪除字元由新的模組級別變數 urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
控制。(請參閱 gh-88048)