- 原文地址:What’s New In Python 3.7
- 原文作者:docs.python.org/
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者: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-8
,C.utf8
和 UTF-8
),stdin
及 stdout
的預設錯誤處理器現在為 surrogateescape
(而不是 strict
);而 stderr
的預設錯誤處理器仍然是 backslashreplace
,與語言環境無關。
預設的本地化編碼強制轉換是隱式的,但是為了能幫助除錯潛在的與本地化相關的整合問題,可以通過設定 PYTHONCOERCECLOCALE=warn
來請求直接用 stderr
發出明確的警告。當核心直譯器初始化時,如果遺留的C語言本地化編碼仍是活動狀態,那麼該設定會導致 Python 執行時發出警告。
另見:
- 現在傳遞給某個函式的引數( 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。) - 暫無。
- 新增了兩個新的操作碼:
LOAD_METHOD
及CALL_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。) - 在非OSX、UNIX平臺上,當構建
_ctypes
模組時不會再打包 libffi 的完整副本以使用。現在在這些平臺上構建_ctypes
時需要已安裝的 libffi 副本。(由 Zachary Ware 參與貢獻的 bpo-27979。) - 結構
PyMemberDef
,PyGetSetDef
,PyStructSequence_Field
,PyStructSequence_Desc
及wrapperbase
的name
和doc
欄位的型別現在為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。) - 在被追蹤的框架上,通過將新的
f_trace_lines
屬性設定為False
,追蹤鉤子現在可以選擇不接收來自直譯器的line
事件。(由 Nick Coghlan 參與貢獻的 bpo-31344。) - 在被追蹤的框架上,通過將新的
f_trace_opcodes
屬性設定為True
,追蹤鉤子現在可以選擇接收來自直譯器的opcode
事件。(由 Nick Coghlan 參與貢獻的 bpo-31344。) - 如果未設定
Py_LIMITED_API
,或其被設定為從0x03050400
到0x03060000
(不含)的值或不小於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 版本中被移除。PyThread_start_new_thread()
和PyThread_get_thread_ident()
返回結果的型別, 及PyThreadState_SetAsyncExc()
中引數 id 的型別從long
變為unsigned long
。(由 Serhiy Storchaka 參與貢獻的 bpo-6532。)- 如果
PyUnicode_AsWideCharString()
的第二個實參是 NULL 且wchar_t*
字串包含空字元,就會引起一個ValueError
的報錯。(由 Serhiy Storchaka 參與貢獻的 bpo-30708。) - Python 啟動器(py.exe)能接收32及64位說明符,且無需指定次要版本。所以
py -3-32
與py -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。)
- 在使用
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
模組中的類Plist
,Dict
和_InternalDict
。函式readPlist()
和readPlistFromBytes()
返回結果中的 dict 型別值現在就是標準的 dict 型別。你再也不能使用屬性訪問來訪問到這些字典裡的項。 - 如果 path 是一個字串,
pkgutil.walk_packages()
現在會引起 ValueError 報錯,之前會返回一個空列表。(由 Sanyam Khurana 參與貢獻的 bpo-24744。) string.Formatter.format()
的格式化字串引數現在是 positional-only,將它作為關鍵字引數傳遞已在 Python 3.5 時被棄用。(由 Serhiy Storchaka 參與貢獻的 bpo-29193。)http.cookies.Morsel
類的屬性key
,value
和coded_value
現在是隻讀的,將值分配給它們已經在 Python 3.5 中被棄用了,需要使用set()
方法對它們進行設定。(由 Serhiy Storchaka 參與貢獻的 bpo-29192。)Module
,FunctionDef
,AsyncFunctionDef
及ClassDef
AST 節點現在新增了一個docstring
欄位,它們自身的首次宣告不再被當做是一個 docstring。類和模組的程式碼物件co_firstlineno
及co_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.timedelta
的repr
已變為在輸出中包含關鍵字引數。(由 Utkarsh Upadhyay 參與貢獻的 bpo-30302。)- 增加了兩個新的操作碼:
LOAD_METHOD
和CALL_METHOD
。(由 Yury Selivanov 和 INADA Naoki 參與貢獻的 bpo-26110。)
PEP 538 —— 把遺留的C語言本地化編碼強制轉換為基於 UTF-8 的編碼。
PEP 由 Nick Coghlan 撰寫及實施。
其他的語言更新
新模組
改進的模組
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
屬性現在會保留自己的同一性,當它們被 copied
或 pickled
時。(由 Serhiy Storchaka 參與貢獻的 bpo-20804。)
xmlrpc.server
xmlrpc.server.SimpleXMLRPCDispatcher
的 register_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,來允許使用者選擇哪些檔案應該被包含在存檔中。
優化
編譯生成及C語言API的更改
其他 CPython 實現的更改
棄用的內容
C語言API的更改
僅Windows平臺
移除的內容
移除的API及特性
移植到 Python 3.7
本小節列出了之前描述的一些更改,以及一些其他bug修復,因而你可能需要對你的程式碼進行更改。
Python API的更改
CPython 位元組碼的更改
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。