- 原文地址: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 运行时发出警告。
另见:
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
属性现在会保留自己的同一性,当它们被 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,来允许用户选择哪些文件应该被包含在存档中。
优化
- 添加了两个新的操作码:
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。)
编译生成及C语言API的更改
- 在非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。)
其他 CPython 实现的更改
- 在被追踪的框架上,通过将新的
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 版本中被移除。
C语言API的更改
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。)
仅Windows平台
- 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。)
移除的内容
移除的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
模块中的类Plist
,Dict
和_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
类的属性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。)
CPython 字节码的更改
- 增加了两个新的操作码:
LOAD_METHOD
和CALL_METHOD
。(由 Yury Selivanov 和 INADA Naoki 参与贡献的 bpo-26110。)
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。
本文转载自: 掘金