[译] Python 3.7 新特性

Python 3.7 新特性

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

本文阐述了Python 3.7所具备的新特性(与3.6版本对比)。html

详见更新日志前端

注意: 预发布版本的用户要留意,本文档目前还属于草案。随着Python 3.7的发布,后续将会有很显著的更新,因此即便阅读过早期版本,也值得再回来看看。python

版本亮点总结

新特性

PEP 538:遗留的C语言本地化编码自动强制转换问题

在 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-8C.utf8UTF-8),stdinstdout 的默认错误处理器如今为 surrogateescape(而不是 strict);而 stderr 的默认错误处理器仍然是 backslashreplace,与语言环境无关。git

默认的本地化编码强制转换是隐式的,可是为了能帮助调试潜在的与本地化相关的集成问题,能够经过设置 PYTHONCOERCECLOCALE=warn 来请求直接用 stderr 发出明确的警告。当核心解释器初始化时,若是遗留的C语言本地化编码还是活动状态,那么该设置会致使 Python 运行时发出警告。github

另见:正则表达式

PEP 538 —— 把遗留的C语言本地化编码强制转换为基于 UTF-8 的编码。数据库

PEP 由 Nick Coghlan 撰写及实施。

其余的语言更新

  • 如今传递给某个函数的参数( argument )能够超过255个,且一个函数的形参( parameter )能够超过255个。(由 Serhiy Storchaka 参与贡献的 bpo-12844bpo-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的更改

其余 CPython 实现的更改

  • 在被追踪的框架上,经过将新的 f_trace_lines 属性设置为 False,追踪钩子如今能够选择不接收来自解释器的 line 事件。(由 Nick Coghlan 参与贡献的 bpo-31344。)
  • 在被追踪的框架上,经过将新的 f_trace_opcodes 属性设置为 True,追踪钩子如今能够选择接收来自解释器的 opcode 事件。(由 Nick Coghlan 参与贡献的 bpo-31344。)

弃用的内容

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 字节码的更改


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOSReact前端后端产品设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索