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 釋出計劃

摘要 – 版本亮點

新語法特性

  • PEP 498,格式化字串字面值。

  • PEP 515,數字字面值中的下劃線。

  • PEP 526,變數註解的語法。

  • PEP 525,非同步生成器。

  • PEP 530:非同步推導式。

新的庫模組

CPython 實現改進

標準庫中的重大改進

安全改進

  • 已新增新的 secrets 模組,以簡化生成適用於管理帳戶身份驗證、令牌等金鑰的加密強偽隨機數的過程。

  • 在 Linux 上,os.urandom() 現在會阻塞,直到系統 urandom 熵池初始化以提高安全性。請參閱 PEP 524 以瞭解其原理。

  • hashlibssl 模組現在支援 OpenSSL 1.1.0。

  • 已改進 ssl 模組的預設設定和特性集。

  • hashlib 模組接收了對 BLAKE2、SHA-3 和 SHAKE 雜湊演算法以及 scrypt() 金鑰派生函式的支援。

Windows 改進

  • PEP 528PEP 529,Windows 檔案系統和控制檯編碼已更改為 UTF-8。

  • 當互動式使用 py.exe 啟動器時,如果使用者沒有指定版本(透過命令列引數或配置檔案),它不再優先選擇 Python 2 而不是 Python 3。 Shebang 行的處理方式保持不變 - 在這種情況下,“python” 指的是 Python 2。

  • python.exepythonw.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 498 – 字串字面量插值。

PEP 由 Eric V. Smith 編寫和實現。

功能文件.

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 526 – 變數註解的語法。

PEP 由 Ryan Gonzalez、Philip House、Ivan Levkivskyi、Lisa Roach 和 Guido van Rossum 編寫。由 Ivan Levkivskyi 實現。

使用或將使用新語法的工具: mypy, pytype, PyCharm 等。

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 實現的一個顯著限制是在同一個函式體中無法同時使用 awaityield。在 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 由 Martin Teichmann 編寫和實現。

功能文件

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 487 – 更簡單的類建立自定義。

PEP 由 Martin Teichmann 編寫和實現。

功能文件

PEP 519:新增檔案系統路徑協議

檔案系統路徑在歷史上一直表示為 strbytes 物件。這導致編寫操作檔案系統路徑的程式碼的人員假設此類物件只是這兩種型別之一(表示檔案描述符的 int 不算在內,因為它不是檔案路徑)。不幸的是,這種假設阻止了檔案系統路徑的替代物件表示形式(如 pathlib)與包括 Python 標準庫在內的現有程式碼一起工作。

為了解決這種情況,定義了一個由 os.PathLike 表示的新介面。透過實現 __fspath__() 方法,一個物件表示它代表一個路徑。然後,一個物件可以提供檔案系統路徑的底層表示形式,作為 strbytes 物件。這意味著,如果一個物件實現了 os.PathLike,或者是一個表示檔案系統路徑的 strbytes 物件,那麼它就被認為是 路徑型 的。程式碼可以使用 os.fspath()os.fsdecode()os.fsencode() 來顯式獲取路徑型物件的 str 和/或 bytes 表示形式。

內建的 open() 函式已更新為接受 os.PathLike 物件,osos.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.datetimedatetime.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.stdinsys.stdoutsys.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__
  ...

(由 Victor Stinner 在 bpo-26516bpo-26564 中貢獻。)

DTrace 和 SystemTap 探測支援

現在可以構建帶有 --with-dtrace 的 Python,這會為直譯器中的以下事件啟用靜態標記

  • 函式呼叫/返回

  • 垃圾回收開始/完成

  • 執行的程式碼行。

這可以用來檢測生產中執行的直譯器,而無需重新編譯特定的 除錯版本 或提供特定於應用程式的分析/除錯程式碼。

有關更多詳細資訊,請參閱 使用 DTrace 和 SystemTap 檢測 CPython

當前的實現在 Linux 和 macOS 上進行了測試。將來可能會新增其他標記。

(由 Łukasz Langa 在 bpo-21590 中貢獻,基於 Jesús Cea Avión、David Malcolm 和 Nikhil Benesch 的補丁。)

其他語言更改

對核心 Python 語言進行的一些較小的更改包括

  • globalnonlocal 語句現在必須在同一作用域中受影響名稱的第一次使用之前以文字形式出現。以前,這是一個 SyntaxWarning

  • 現在可以將特殊方法設定為 None,以指示相應的操作不可用。例如,如果一個類將 __iter__() 設定為 None,則該類不可迭代。(由 Andrew Barnert 和 Ivan Levkivskyi 在 bpo-25958 中貢獻。)

  • 重複回溯行的長序列現在被縮寫為 "[Previous line repeated {count} more times]"(有關示例,請參閱 回溯)。(由 Emanuel Barry 在 bpo-26823 中貢獻。)

  • 匯入操作現在會在找不到模組時引發新的異常 ModuleNotFoundErrorImportError 的子類)。當前檢查 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 中貢獻。)

  • FutureTask 類現在具有最佳化的 C 實現,這使得 asyncio 程式碼速度提高了 30%。(由 Yury Selivanov 和 INADA Naoki 在 bpo-26081bpo-28544 中貢獻。)

binascii

b2a_base64() 函式現在接受一個可選的 *newline* 關鍵字引數,以控制是否將換行符附加到返回值。(由 Victor Stinner 在 bpo-25357 中貢獻。)

cmath

添加了新的 cmath.tau (τ) 常量。(由 Lisa Roach 在 bpo-12345 中貢獻,有關詳細資訊,請參閱 PEP 628 。)

新的常量:cmath.infcmath.nanmath.infmath.nan 匹配,以及 cmath.infjcmath.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

datetimetime 類新增了 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 模組中添加了兩個新的列舉基類:FlagIntFlags。兩者都用於定義可以使用按位運算子組合的常量。(由 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-33642bpo-33768bpo-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

當無法找到模組時,匯入現在會引發新的異常 ModuleNotFoundErrorImportError 的子類)。當前檢查 ImportError 的程式碼(在 try-except 中)仍然有效。(由 Eric Snow 在 bpo-15767 中貢獻。)

importlib.util.LazyLoader 現在在包裝的載入器上呼叫 create_module(),從而消除了 importlib.machinery.BuiltinImporterimportlib.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 (τ) 常量已新增到 mathcmath 模組。(由 Lisa Roach 在 bpo-12345 中貢獻,有關詳細資訊,請參見 PEP 628。)

multiprocessing

multiprocessing.Manager() 返回的 代理物件 現在可以巢狀。(由 Davin Potts 在 bpo-6766 中貢獻。)

os

有關 osos.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-25011bpo-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_DOMAINSO_PROTOCOLSO_PEERSECSO_PASSSEC。(由 Christian Heimes 在 bpo-26907 中貢獻。)

setsockopt() 現在支援 setsockopt(level, optname, None, optlen: int) 形式。(由 Christian Heimes 在 bpo-27744 中貢獻。)

socket 模組現在支援地址族 AF_ALG,以與 Linux 核心加密 API 介面。ALG_*SOL_ALGsendmsg_afalg() 已被新增。(由 Christian Heimes 在 bpo-27744 中貢獻,並得到 Victor Stinner 的支援。)

添加了新的 Linux 常量 TCP_USER_TIMEOUTTCP_CONGESTION。(由 Omar Sandoval 貢獻,bpo-26273)。

socketserver

基於 socketserver 模組的伺服器,包括在 http.serverxmlrpc.serverwsgiref.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-27850bpo-27766 中貢獻。)

SSLContext 具有更好的選項和密碼預設配置。(由 Christian Heimes 在 bpo-28043 中貢獻。)

可以使用新的 SSLSession 類將 SSL 會話從一個客戶端連線複製到另一個客戶端連線。TLS 會話恢復可以加速初始握手,減少延遲並提高效能(由 Christian Heimes 在 bpo-19500 中基於 Alex Warhawk 的草案貢獻。)

可以使用新的 get_ciphers() 方法按密碼優先順序順序獲取已啟用密碼的列表。

所有常量和標誌都已轉換為 IntEnumIntFlags。(由 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 建構函式和所有透過它傳遞引數的函式現在接受 encodingerrors 引數。指定其中任何一個都會為 stdinstdoutstderr 流啟用文字模式。(由 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_gmtofftm_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 類有以下改進

urllib.request

如果 HTTP 請求具有檔案或可迭代的 body(而不是位元組物件),但沒有 Content-Length 標頭,則 AbstractHTTPHandler 現在會回退使用分塊傳輸編碼,而不是丟擲錯誤。(由 Demian Brecht 和 Rolf Krahl 在 bpo-12319 中貢獻。)

urllib.robotparser

RobotFileParser 現在支援 Crawl-delayRequest-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-26568bpo-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

添加了 64 位整數型別 REG_QWORD。(由 Clement Rouault 在 bpo-23026 中貢獻。)

winsound

允許將關鍵字引數傳遞給 BeepMessageBeepPlaySound (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-26647bpo-28050 中。)

  • 現在,asyncio.Future 類有一個最佳化的 C 實現。(由 Yury Selivanov 和 INADA Naoki 在 bpo-26081 中貢獻。)

  • 現在,asyncio.Task 類有一個最佳化的 C 實現。(由 Yury Selivanov 在 bpo-28544 中貢獻。)

  • typing 模組中的各種實現改進(例如泛型型別的快取)允許效能提高高達 30 倍,並減少記憶體佔用。

  • 對於錯誤處理程式 surrogateescapeignorereplace,ASCII 解碼器現在的速度提高了 60 倍(由 Victor Stinner 在 bpo-24870 中貢獻)。

  • 對於錯誤處理程式 surrogateescape,ASCII 和 Latin1 編碼器現在的速度提高了 3 倍(由 Victor Stinner 在 bpo-25227 中貢獻)。

  • 對於錯誤處理程式 ignorereplacesurrogateescapesurrogatepass,UTF-8 編碼器現在的速度提高了 75 倍(由 Victor Stinner 在 bpo-25267 中貢獻)。

  • 對於錯誤處理程式 ignorereplacesurrogateescape,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-25638bpo-25873bpo-25869 中貢獻。)

  • 從浮點數和小數建立 fractions.Fraction 例項現在速度提高了 2 到 3 倍。(由 Serhiy Storchaka 在 bpo-25971 中貢獻)。

構建和 C API 更改

其他改進

  • --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)]
    

已棄用

新關鍵字

asyncawait 不建議用作變數、類、函式或模組名。由 PEP 492 在 Python 3.5 中引入,它們將在 Python 3.7 中成為正式關鍵字。從 Python 3.6 開始,使用 asyncawait 作為名稱將生成 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

asynchat 已棄用,推薦使用 asyncio。(由 Mariatta 在 bpo-25002 中貢獻。)

asyncore

asyncore 已棄用,推薦使用 asyncio。(由 Mariatta 在 bpo-25002 中貢獻。)

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-25791bpo-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。

諸如 certfilekeyfilecheck_hostname 等與 SSL 相關的引數,在 ftplibhttp.clientimaplibpoplibsmtplib 中已被棄用,建議改用 context。(由 Christian Heimes 在 bpo-28022 中貢獻。)

ssl 模組的幾個協議和函式現在已棄用。某些功能在未來的 OpenSSL 版本中將不再可用。其他功能已被棄用,建議改用不同的 API。(由 Christian Heimes 在 bpo-28022bpo-26470 中貢獻。)

tkinter

現在已棄用 tkinter.tix 模組。tkinter 使用者應改用 tkinter.ttk

venv

已棄用 pyvenv 指令碼,建議使用 python3 -m venv。這可以避免 pyvenv 連線到哪個 Python 直譯器的混淆,從而避免虛擬環境使用哪個 Python 直譯器的混淆。(由 Brett Cannon 在 bpo-25154 中貢獻。)

xml

  • 作為對 DTD 和外部實體檢索的緩解措施,xml.dom.minidomxml.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.usagetraceback.modnametraceback.fullmodnametraceback.find_lines_from_codetraceback.find_linestraceback.find_stringstraceback.find_executable_lines 方法。它們是自 Python 3.2 起已棄用的未記錄方法,並且可以從私有方法獲得等效功能。

  • 刪除了 tkinter 視窗小部件類中的 tk_menuBar()tk_bindForTraversal() 虛擬方法(相應的 Tk 命令自 Tk 4.0 起已過時)。

  • zipfile.ZipFile 類的 open() 方法不再支援 'U' 模式(自 Python 3.4 起已棄用)。請使用 io.TextIOWrapper通用換行符 模式讀取壓縮的文字檔案。

  • 刪除了未記錄的 INCDROMDLFCNTYPESCDIOSTROPTS 模組。它們曾存在於特定於平臺的 Lib/plat-*/ 目錄中,但長期過時、在不同平臺上的可用性不一致且未維護。建立這些模組的指令碼仍然可以在原始碼發行版的 Tools/scripts/h2py.py 中找到。

  • 刪除了已棄用的 asynchat.fifo 類。

移植到 Python 3.6

本節列出了前面描述的更改和其他可能需要更改程式碼的錯誤修復。

“python”命令列為的更改

  • 現在預設關閉使用定義的 COUNT_ALLOCSSHOW_ALLOC_COUNTSHOW_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_linenoPyFrame_GetLineNumber()PyCode_Addr2Line() 的函式不受影響。直接解碼 co_lnotab 的函式應更新為對行號增量使用有符號的 8 位整數型別,但這僅在支援使用負行號增量的應用程式時才是必需的。請參閱 Objects/lnotab_notes.txt 獲取 co_lnotab 的格式以及如何解碼它,並參閱 PEP 511 瞭解其基本原理。

  • compileall 模組中的函式現在返回布林值而不是 10 來表示成功或失敗。由於布林值是整數的子類,因此如果您執行 10 的身份檢查,這才會成為問題。請參閱 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, threadingwave。這意味著當使用 import * 時,它們將匯出新的符號。(由 Joel Taddei 和 Jacek Kołodziej 在 bpo-23883 中貢獻。)

  • 當執行相對匯入時,如果 __package____spec__.parent 不相等,則會引發 ImportWarning。(由 Brett Cannon 在 bpo-25791 中貢獻。)

  • 當執行相對匯入且沒有已知父包時,將引發 ImportError。以前,可能會引發 SystemError。(由 Brett Cannon 在 bpo-18018 中貢獻。)

  • 基於 socketserver 模組的伺服器,包括在 http.serverxmlrpc.serverwsgiref.simple_server 中定義的伺服器,現在只捕獲派生自 Exception 的異常。 因此,如果請求處理程式引發諸如 SystemExitKeyboardInterrupt 的異常,則不再呼叫 handle_error(),並且該異常將停止單執行緒伺服器。(由 Martin Panter 在 bpo-23430 中貢獻。)

  • spwd.getspnam() 現在如果使用者沒有許可權,則會引發 PermissionError,而不是 KeyError

  • 如果底層系統呼叫報告錯誤(例如 EBADF),則 socket.socket.close() 方法現在會引發異常。(由 Martin Panter 在 bpo-26685 中貢獻。)

  • smtpd.SMTPChannelsmtpd.SMTPServer 建構函式的 decode_data 引數現在預設為 False。 這意味著傳遞給 process_message() 的引數現在預設為位元組物件,並且將向 process_message() 傳遞關鍵字引數。 已經根據 3.5 生成的棄用警告更新的程式碼不會受到影響。

  • dump()dumps()load()loads() 函式以及 JSONEncoderJSONDecoder 類建構函式在 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-26647bpo-28050 中提供輸入和審查。)

  • 作為 格式化字串字面量 實現的一部分,新的 FORMAT_VALUEBUILD_STRING 操作碼。(由 Eric Smith 在 bpo-25483 中貢獻,Serhiy Storchaka 在 bpo-27078 中貢獻。)

  • 新的 BUILD_CONST_KEY_MAP 操作碼用於最佳化具有常量鍵的字典的建立。(由 Serhiy Storchaka 在 bpo-27140 中貢獻。)

  • 為了獲得更好的效能和更簡單的實現,函式呼叫操作碼已經過大量修改。MAKE_FUNCTION, CALL_FUNCTION, CALL_FUNCTION_KWBUILD_MAP_UNPACK_WITH_CALL 操作碼已修改,添加了新的 CALL_FUNCTION_EXBUILD_TUPLE_UNPACK_WITH_CALL,並移除了 CALL_FUNCTION_VARCALL_FUNCTION_VAR_KWMAKE_CLOSURE 操作碼。(由 Demur Rumed 在 bpo-27095 中貢獻,Serhiy Storchaka 在 bpo-27213, bpo-28257 中貢獻。)

  • 為了支援新的 變數註解 語法,添加了新的 SETUP_ANNOTATIONSSTORE_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-22898bpo-30697 中貢獻。)

Python 3.6.5 中的顯著變化

現在,locale.localeconv() 函式在某些情況下會臨時將 LC_CTYPE 區域設定設定為 LC_NUMERIC 區域設定。(由 Victor Stinner 在 bpo-31900 中貢獻。)

Python 3.6.7 中的顯著變化

xml.dom.minidomxml.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