[譯] Python 3.7 新特性

  • 原文地址:What』s New In Python 3.7
  • 原文作者:docs.python.org/
  • 譯文出自:掘金翻譯計劃
  • 本文永久鏈接:github.com/xitu/gold-mi
  • 譯者:winjeysong
  • 校對者:LynnShaw

Python 3.7 新特性

  • 版本:3.7.0a1
  • 日期:2017年9月27日

本文闡述了Python 3.7所具有的新特性(與3.6版本對比)。

詳見更新日誌。

注意: 預發布版本的用戶要留意,本文檔目前還屬於草案。隨著Python 3.7的發布,後續將會有很顯著的更新,所以即使閱讀過早期版本,也值得再回來看看。

版本亮點總結

新特性

PEP 538:遺留的C語言本地化編碼自動強制轉換問題

在 Python 3 系列版本中,確定一個合理的默認策略來處理當前位於非 Windows 平台上默認C語言本地化編碼隱式採用的「7位 ASCII」,是個永不停歇的挑戰。

PEP 538 更新了默認的解釋器命令行界面,從而能自動地將本地化編碼強制轉換為一種可用的且基於 UTF-8的編碼,它就是文檔里所描述的新環境變數 PYTHONCOERCECLOCALE。用這種方式自動設置 LC_CTYPE 意味著核心解釋器和關於本地化識別的C語言擴展(如 readline)將會採用 UTF-8 作為默認的文本編碼,而不是 ASCII。

PEP 11 中有關平台支持的定義也已經更新,限制了對於全文處理的支持,變為適當的基於非 ASCII 的本地化編碼配置。

作為變化的一部分,當使用任一強制轉換的已定義目標編碼(當前為 C.UTF-8C.utf8UTF-8),stdinstdout 的默認錯誤處理器現在為 surrogateescape(而不是 strict);而 stderr 的默認錯誤處理器仍然是 backslashreplace,與語言環境無關。

默認的本地化編碼強制轉換是隱式的,但是為了能幫助調試潛在的與本地化相關的集成問題,可以通過設置 PYTHONCOERCECLOCALE=warn 來請求直接用 stderr 發出明確的警告。當核心解釋器初始化時,如果遺留的C語言本地化編碼仍是活動狀態,那麼該設置會導致 Python 運行時發出警告。

另見:

PEP 538 —— 把遺留的C語言本地化編碼強制轉換為基於 UTF-8 的編碼。

PEP 由 Nick Coghlan 撰寫及實施。

其他的語言更新

  • 現在傳遞給某個函數的參數( argument )可以超過255個,且一個函數的形參( parameter )可以超過255個。(由 Serhiy Storchaka 參與貢獻的 bpo-12844 和 bpo-18896。)
  • bytes.fromhex()bytearray.fromhex() 現在將忽略所有的 ASCII 空白符,而不止空格。(由 Robert Xiao 參與貢獻的 bpo-28927。)
  • 現在當 from ... import ... 失敗的時候,ImportError 會展示模塊名及模塊 __file__ 路徑。(由 Matthias Bussonnier 參與貢獻的 bpo-29546。)
  • 現在已支持將包含絕對 imports 的循環 imports 通過名稱綁定到一個子模塊上。(由 Serhiy Storchaka 參與貢獻的 bpo-30024。)
  • 現在,object.__format__(x,) 等價於 str(x) ,而不是 format(str(self),)。(由 Serhiy Storchaka 參與貢獻的 bpo-28974。)

新模塊

  • 暫無。

改進的模塊

argparse

在大多數的 unix 命令中,parse_intermixed_args() 能讓用戶在命令行里混用選項和位置參數,它支持大部分而非全部的 argparse 功能。(由 paul.j3 參與貢獻的 bpo-14191。)

binascii

b2a_uu() 函數現在能接受一個可選的 backtick 關鍵字參數,當它的值為 true 時,所有的「0」都將被替換為 ` 而非空格。(由 Xiang Zhang 參與貢獻的 bpo-30103。)

calendar

HTMLCalendar類具有新的類屬性,它能在生成的 HTML 日曆中很方便地自定義 CSS 類。(由 Oz Tiram 參與貢獻的 bpo-30095。)

cgi

parse_multipart() 作為 FieldStorage 會返回同樣的結果:對於非文件欄位,與鍵相關聯的值是一個字元串列表,而非位元組。(由 Pierre Quentel 參與貢獻的 bpo-29979。)

contextlib

已添加 contextlib.asynccontextmanager()。(由 Jelle Zijlstra 參與貢獻的 bpo-29679。)

dis

dis() 函數現在可以反彙編嵌套代碼對象(代碼解析,生成器表達式和嵌套函數,以及用於構建嵌套類的代碼)。(由 Serhiy Storchaka 參與貢獻的 bpo-11822。)

distutils

README.rst 現已包含在 distutils 的標準自述文件列表中,進而它也分別包含在各源碼中。(由 Ryan Gonzalez 參與貢獻的 bpo-11913。)

http.server

SimpleHTTPRequestHandler 支持 HTTP If-Modified-Since 頭文件。如果在頭文件指定的時間之後,目標文件未被修改,則伺服器返回 304 響應狀態碼。 (由 Pierre Quentel 參與貢獻的 bpo-29654。)

SimpleHTTPRequestHandler 中添加 directory 參數,在命令行的 server 模塊中添加 --directory。有了這個參數,伺服器將會運行在指定目錄下,默認使用當前工作目錄。(由 Stéphane Wirtel and Julien Palard 參與貢獻的 bpo-28707。)

locale

locale 模塊的 format_string() 方法中添加了另一個參數 monetary 。如果 monetary 的值為 true,會轉換為使用貨幣千位分隔符和分組字元串。(由 Garvit 參與貢獻的 bpo-10379。)

math

新的 remainder() 函數實現了 IEEE 754-style 的取余操作。(由 Mark Dickinson 參與貢獻的 bpo-29962。)

os

增加了對 fwalk()bytes 路徑的支持。(由 Serhiy Storchaka 參與貢獻的 bpo-28682。) (Contributed by Serhiy Storchaka in bpo-28682.)

在Unix平台上,增加了對 scandir() 中 file descriptors 的支持。(由 Serhiy Storchaka 參與貢獻的 bpo-25996。)

新的 os.register_at_fork() 函數允許註冊 Python 的回調在進程的分支上執行。(由 Antoine Pitrou 參與貢獻的 bpo-16500。)

pdb

set_trace() 現在需要一個可選的 header 強制關鍵字參數。如果已給出,它將會在調試開始前列印至控制台。

string

string.Template 現在可以分別為花括弧佔位符和非花括弧佔位符選擇性地修改正則表達式模式。(由 Barry Warsaw 參與貢獻的 bpo-1198569。)

unittest.mock

sentinel 屬性現在會保留自己的同一性,當它們被 copiedpickled 時。(由 Serhiy Storchaka 參與貢獻的 bpo-20804。)

xmlrpc.server

xmlrpc.server.SimpleXMLRPCDispatcherregister_function() 及其子類能被用作裝飾器。(由 Xiang Zhang 參與貢獻的 bpo-7769。)

unicodedata

內部的 unicodedata 資料庫已升級,能夠使用 Unicode 10。 (由 Benjamin Peterson 參與貢獻。)

urllib.parse

urllib.parse.quote() 已經從 RFC 2396 升級至 RFC 3986,將 ~ 添加到默認情況下從不引用的字符集中。(由 Christian Theune 和 Ratnadeep Debnath 參與貢獻的 bpo-16285。)

uu

函數 encode() 現在能接受一個可選的關鍵字參數 backtick ,當它的值為 true 時,「0」會被 ` 替代而非空格。(由 Xiang Zhang 參與貢獻的 bpo-30103。)

zipapp

函數 zipapp.create_archive() 現在能接受一個可選的參數 filter,來允許用戶選擇哪些文件應該被包含在存檔中。

優化

  • 添加了兩個新的操作碼:LOAD_METHODCALL_METHOD,從而避免為了方法調用的綁定方法對象的實例化,這將導致方法調用的速度提升20%。(由 Yury Selivanov 及 INADA Naoki 參與貢獻的 bpo-26110。)
  • 當在一字元串內查找某些特殊的 Unicode 字元(如烏克蘭大寫字母 「?」)時,將會比查找其他字元慢25倍,但現在最差情況下也只慢了3倍。(由 Serhiy Storchaka 參與貢獻的 bpo-24821。)
  • 標準C語言庫的快速執行現在能用於 math 模塊內的 erf()erfc() 函數。(由 Serhiy Storchaka 參與貢獻的 bpo-26121。)
  • 由於使用了 os.scandir() 函數,os.fwalk() 函數的效率已經提升了2倍。 (由 Serhiy Storchaka 參與貢獻的 bpo-25996。)
  • 優化了對於大小寫忽略的匹配及對於 regular expressions 的查找。 對一些字元的查找速度現在能提升至原來的20倍。(由 Serhiy Storchaka 參與貢獻的 bpo-30285。)
  • 在較重負荷下,selectors.EpollSelector.modify()selectors.PollSelector.modify()selectors.DevpollSelector.modify() 將比原來快10%左右。(由 Giampaolo Rodola』 參與貢獻的 bpo-30014。)

編譯生成及C語言API的更改

  • 在非OSX、UNIX平台上,當構建 _ctypes 模塊時不會再打包 libffi 的完整副本以使用。現在在這些平台上構建 _ctypes 時需要已安裝的 libffi 副本。(由 Zachary Ware 參與貢獻的 bpo-27979。)
  • 結構 PyMemberDefPyGetSetDefPyStructSequence_FieldPyStructSequence_Descwrapperbasenamedoc欄位的類型現在為 const char * 而非 char *。(由 Serhiy Storchaka 參與參與貢獻的 bpo-28761。)
  • PyUnicode_AsUTF8AndSize()PyUnicode_AsUTF8() 返回的類型是 const char * 而非 char *。(由 Serhiy Storchaka 參與貢獻的 bpo-28769。)
  • 新增了函數 PySlice_Unpack()PySlice_AdjustIndices()。 (由 Serhiy Storchaka 參與貢獻的 bpo-27867。)
  • 已棄用 PyOS_AfterFork(),支持使用新函數 PyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child()。 (由 by Antoine Pitrou 參與貢獻的 bpo-16500。)
  • Windows 構建進程不再依賴 Subversion 來 pull 外部資源,而是通過使用 Python 腳本從 Github 下載 zip 文件。如果系統未安裝 Python 3.6(通過命令 py -3.6),將會使用 NuGet 來下載 32位的 Python 副本。(由 Zachary Ware 參與貢獻的 bpo-30450。)
  • 移除了對於構建 --without-threads 的支持。(由 Antoine Pitrou 參與貢獻的 bpo-31370。)

其他 CPython 實現的更改

  • 在被追蹤的框架上,通過將新的 f_trace_lines 屬性設置為 False,追蹤鉤子現在可以選擇不接收來自解釋器的 line 事件。(由 Nick Coghlan 參與貢獻的 bpo-31344。)
  • 在被追蹤的框架上,通過將新的 f_trace_opcodes 屬性設置為 True,追蹤鉤子現在可以選擇接收來自解釋器的 opcode 事件。(由 Nick Coghlan 參與貢獻的 bpo-31344。)

棄用的內容

  • 如果未設置 Py_LIMITED_API ,或其被設置為從 0x030504000x03060000 (不含)的值或不小於 0x03060100 的值,將棄用函數 PySlice_GetIndicesEx() 並用宏將其替代。(由 Serhiy Storchaka 參與貢獻的 bpo-27867。)
  • format_string() 來替代 locale 模塊中被棄用的 format()。(由 Garvit 參與貢獻的 bpo-10379。)
  • 方法 MetaPathFinder.find_module()(由 MetaPathFinder.find_spec() 替代)和方法 PathEntryFinder.find_loader()(由PathEntryFinder.find_spec() 替代)都已在 Python 3.4 被棄用,且現在會發出 DeprecationWarning的警告。(由 Matthias Bussonnier 參與貢獻的 bpo-29576。)
  • gettext 中通過使用非整型值來篩選複數形式的值已被棄用,它不會再起作用。(由 Serhiy Storchaka 參與貢獻的 bpo-28692。)
  • macpath 模塊已被棄用,且它將會在 Python 3.8 版本中被移除。

C語言API的更改

  • PyThread_start_new_thread()PyThread_get_thread_ident() 返回結果的類型, 及 PyThreadState_SetAsyncExc() 中參數 id 的類型從 long 變為 unsigned long。(由 Serhiy Storchaka 參與貢獻的 bpo-6532。)
  • 如果 PyUnicode_AsWideCharString() 的第二個實參是 NULLwchar_t* 字元串包含空字元,就會引起一個 ValueError 的報錯。(由 Serhiy Storchaka 參與貢獻的 bpo-30708。)

僅Windows平台

  • Python 啟動器(py.exe)能接收32及64位說明符,且無需指定次要版本。所以 py -3-32py -3-64 也會和 py -3.7-32 一樣有效,並且現在能接受 -m-64 與 -m.n-64 來強制使用64位 Python,即使32位在使用中也是如此。如果指定版本不可用,py.exe將會報錯退出。(由 Steve Barnes 參與貢獻的 bpo-30291。)
  • 啟動器可以通過命令 「py -0」 運行,生成已安裝 Python 的版本列表,標有星號的是為默認,運行 「py -0p」 將包含安裝路徑。如果 py 使用無法匹配的版本說明符運行,也會列印縮略形式的可用說明符列表。(由 Steve Barnes 參與貢獻的 bpo-30362。)

移除的內容

移除的API及特性

  • 在使用 re.sub() 的替換模板中,由 及一個 ASCII 字母組成的未知轉義符已在 Python 3.5 中被棄用,現在使用將會報錯。
  • 移除了 tarfile.TarFile.add() 中的實參 exclude 。它已在 Python 2.7 和 3.2 版本被棄用,取而代之的是使用實參 filter
  • ntpath 模塊中的 splitunc() 函數在 Python 3.1 被棄用,現在已被移除。使用 splitdrive() 函數來替代。
  • collections.namedtuple() 不再支持 verbose 參數和 _source 屬性,該屬性用於顯示為已命名元組類所生成的源碼。這是用來提升類創建速度的優化設計的一部分。(由 Jelle Zijlstra 貢獻並由 INADA Naoki,Serhiy Storchaka,和 Raymond Hettinger 進一步完善的 bpo-28638。)
  • 函數 bool()float()list()tuple() 不再使用關鍵字參數。int() 的第一個參數現在只能作為位置參數傳遞。
  • 移除了先前在 Python 2.4 版本已被棄用的在 plistlib 模塊中的類 PlistDict_InternalDict。函數 readPlist()readPlistFromBytes() 返回結果中的 dict 類型值現在就是標準的 dict 類型。你再也不能使用屬性訪問來訪問到這些字典里的項。

移植到 Python 3.7

本小節列出了之前描述的一些更改,以及一些其他bug修復,因而你可能需要對你的代碼進行更改。

Python API的更改

  • 如果 path 是一個字元串,pkgutil.walk_packages() 現在會引起 ValueError 報錯,之前會返回一個空列表。(由 Sanyam Khurana 參與貢獻的 bpo-24744。)
  • string.Formatter.format() 的格式化字元串參數現在是 positional-only,將它作為關鍵字參數傳遞已在 Python 3.5 時被棄用。(由 Serhiy Storchaka 參與貢獻的 bpo-29193。)
  • http.cookies.Morsel 類的屬性 keyvaluecoded_value 現在是只讀的,將值分配給它們已經在 Python 3.5 中被棄用了,需要使用 set() 方法對它們進行設置。(由 Serhiy Storchaka 參與貢獻的 bpo-29192。)
  • ModuleFunctionDefAsyncFunctionDefClassDef AST 節點現在新增了一個 docstring 欄位,它們自身的首次聲明不再被當做是一個 docstring。類和模塊的代碼對象 co_firstlinenoco_lnotab 會因這個更改而受到影響。(由 INADA Naoki and Eugene Toder 參與貢獻的 bpo-29463。)
  • os.makedirs() 的參數 mode 不再影響新建的中級目錄的文件許可權位,要想設置它們的文件許可權位,你可以在調用 makedirs() 之前設置 umask。(由 Serhiy Storchaka 參與貢獻的 bpo-19930。)
  • 現在 struct.Struct.format 的類型是 str 而非 bytes。(由 Victor Stinner 參與貢獻的 bpo-21071。)
  • 由於 socket 模塊的內部更改,你將無法在舊版本 Python 中通過 socket.fromshare() 創建一個 share()-ed(共享的)介面。
  • datetime.timedeltarepr 已變為在輸出中包含關鍵字參數。(由 Utkarsh Upadhyay 參與貢獻的 bpo-30302。)

CPython 位元組碼的更改

  • 增加了兩個新的操作碼:LOAD_METHODCALL_METHOD。(由 Yury Selivanov 和 INADA Naoki 參與貢獻的 bpo-26110。)

掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。

推薦閱讀:

Python數據分析及可視化實例之可視化圖表應用簡介
Django學習筆記一:搭建簡易博客
使用 Python 連接 Todoist 與 Pomotodo
黃哥推薦學習Python 10本好書。
Scrapy對接Selenium

TAG:稀土掘金 | Python |