- 原文地址:What’s New In Python 3.7
- 原文做者:docs.python.org/
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:winjeysong
- 校對者:LynnShaw
本文闡述了Python 3.7所具備的新特性(與3.6版本對比)。html
詳見更新日誌。前端
注意: 預發佈版本的用戶要留意,本文檔目前還屬於草案。隨着Python 3.7的發佈,後續將會有很顯著的更新,因此即便閱讀過早期版本,也值得再回來看看。python
在 Python 3 系列版本中,肯定一個合理的默認策略來處理當前位於非 Windows 平臺上默認C語言本地化編碼隱式採用的「7位 ASCII」,是個永不停歇的挑戰。react
PEP 538 更新了默認的解釋器命令行界面,從而能自動地將本地化編碼強制轉換爲一種可用的且基於 UTF-8的編碼,它就是文檔裏所描述的新環境變量 PYTHONCOERCECLOCALE
。用這種方式自動設置 LC_CTYPE
意味着核心解釋器和關於本地化識別的C語言擴展(如 readline
)將會採用 UTF-8 做爲默認的文本編碼,而不是 ASCII。android
PEP 11 中有關平臺支持的定義也已經更新,限制了對於全文處理的支持,變爲適當的基於非 ASCII 的本地化編碼配置。ios
做爲變化的一部分,當使用任一強制轉換的已定義目標編碼(當前爲 C.UTF-8
,C.utf8
和 UTF-8
),stdin
及 stdout
的默認錯誤處理器如今爲 surrogateescape
(而不是 strict
);而 stderr
的默認錯誤處理器仍然是 backslashreplace
,與語言環境無關。git
默認的本地化編碼強制轉換是隱式的,可是爲了能幫助調試潛在的與本地化相關的集成問題,能夠經過設置 PYTHONCOERCECLOCALE=warn
來請求直接用 stderr
發出明確的警告。當核心解釋器初始化時,若是遺留的C語言本地化編碼還是活動狀態,那麼該設置會致使 Python 運行時發出警告。github
另見:正則表達式
PEP 538 —— 把遺留的C語言本地化編碼強制轉換爲基於 UTF-8 的編碼。數據庫
PEP 由 Nick Coghlan 撰寫及實施。
bytes.fromhex()
及 bytearray.fromhex()
如今將忽略全部的 ASCII 空白符,而不止空格。(由 Robert Xiao 參與貢獻的 bpo-28927。)from ... import ...
失敗的時候,ImportError
會展現模塊名及模塊 __file__
路徑。(由 Matthias Bussonnier 參與貢獻的 bpo-29546。)object.__format__(x,'')
等價於 str(x)
,而不是 format(str(self),'')
。(由 Serhiy Storchaka 參與貢獻的 bpo-28974。)在大多數的 unix 命令中,parse_intermixed_args()
能讓用戶在命令行裏混用選項和位置參數,它支持大部分而非所有的 argparse 功能。(由 paul.j3 參與貢獻的 bpo-14191。)
b2a_uu()
函數如今能接受一個可選的 backtick 關鍵字參數,當它的值爲 true 時,全部的「0」都將被替換爲 '`'
而非空格。(由 Xiang Zhang 參與貢獻的 bpo-30103。)
HTMLCalendar
類具備新的類屬性,它能在生成的 HTML 日曆中很方便地自定義 CSS 類。(由 Oz Tiram 參與貢獻的 bpo-30095。)
parse_multipart()
做爲 FieldStorage
會返回一樣的結果:對於非文件字段,與鍵相關聯的值是一個字符串列表,而非字節。(由 Pierre Quentel 參與貢獻的 bpo-29979。)
已添加 contextlib.asynccontextmanager()
。(由 Jelle Zijlstra 參與貢獻的 bpo-29679。)
dis()
函數如今能夠反彙編嵌套代碼對象(代碼解析,生成器表達式和嵌套函數,以及用於構建嵌套類的代碼)。(由 Serhiy Storchaka 參與貢獻的 bpo-11822。)
README.rst 現已包含在 distutils 的標準自述文件列表中,進而它也分別包含在各源碼中。(由 Ryan Gonzalez 參與貢獻的 bpo-11913。)
SimpleHTTPRequestHandler
支持 HTTP If-Modified-Since 頭文件。若是在頭文件指定的時間以後,目標文件未被修改,則服務器返回 304 響應狀態碼。 (由 Pierre Quentel 參與貢獻的 bpo-29654。)
在 SimpleHTTPRequestHandler
中添加 directory
參數,在命令行的 server
模塊中添加 --directory
。有了這個參數,服務器將會運行在指定目錄下,默認使用當前工做目錄。(由 Stéphane Wirtel and Julien Palard 參與貢獻的 bpo-28707。)
在 locale
模塊的 format_string()
方法中添加了另外一個參數 monetary 。若是 monetary 的值爲 true,會轉換爲使用貨幣千位分隔符和分組字符串。(由 Garvit 參與貢獻的 bpo-10379。)
新的 remainder()
函數實現了 IEEE 754-style 的取餘操做。(由 Mark Dickinson 參與貢獻的 bpo-29962。)
增長了對 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。)
set_trace()
如今須要一個可選的 header
強制關鍵字參數。若是已給出,它將會在調試開始前打印至控制檯。
string.Template
如今能夠分別爲花括號佔位符和非花括號佔位符選擇性地修改正則表達式模式。(由 Barry Warsaw 參與貢獻的 bpo-1198569。)
sentinel
屬性如今會保留本身的同一性,當它們被 copied
或 pickled
時。(由 Serhiy Storchaka 參與貢獻的 bpo-20804。)
xmlrpc.server.SimpleXMLRPCDispatcher
的 register_function()
及其子類能被用做裝飾器。(由 Xiang Zhang 參與貢獻的 bpo-7769。)
內部的 unicodedata
數據庫已升級,可以使用 Unicode 10。 (由 Benjamin Peterson 參與貢獻。)
urllib.parse.quote()
已經從 RFC 2396 升級至 RFC 3986,將 ~
添加到默認狀況下從不引用的字符集中。(由 Christian Theune 和 Ratnadeep Debnath 參與貢獻的 bpo-16285。)
函數 encode()
如今能接受一個可選的關鍵字參數 backtick ,當它的值爲 true 時,「0」會被 '`'
替代而非空格。(由 Xiang Zhang 參與貢獻的 bpo-30103。)
函數 zipapp.create_archive()
如今能接受一個可選的參數 filter,來容許用戶選擇哪些文件應該被包含在存檔中。
LOAD_METHOD
及 CALL_METHOD
,從而避免爲了方法調用的綁定方法對象的實例化,這將致使方法調用的速度提高20%。(由 Yury Selivanov 及 INADA Naoki 參與貢獻的 bpo-26110。)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。)_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。)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。)py -3-32
與 py -3-64
也會和 py -3.7-32
同樣有效,而且如今能接受 -m-64 與 -m.n-64 來強制使用64位 Python,即便32位在使用中也是如此。若是指定版本不可用,py.exe將會報錯退出。(由 Steve Barnes 參與貢獻的 bpo-30291。)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()
的第一個參數如今只能做爲位置參數傳遞。plistlib
模塊中的類 Plist
,Dict
和 _InternalDict
。函數 readPlist()
和 readPlistFromBytes()
返回結果中的 dict 類型值如今就是標準的 dict 類型。你不再能使用屬性訪問來訪問到這些字典裏的項。本小節列出了以前描述的一些更改,以及一些其餘bug修復,於是你可能須要對你的代碼進行更改。
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。)掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。