python 3.7的新功能¶
- 编辑
埃尔维斯·普兰斯基·维奇<elvis@magic.io>
本文解释了与3.6相比,python 3.7中的新特性。python 3.7于2018年6月27日发布。有关详细信息,请参阅 changelog .
总结——发布亮点¶
新语法功能:
PEP 563 ,推迟了类型批注的计算。
向后不兼容的语法更改:
新库模块:
新的内置功能:
PEP 553 ,新的
breakpoint()
功能。
python数据模型改进:
PEP 562 ,自定义对模块属性的访问。
PEP 560 ,对类型模块和泛型类型的核心支持。
插入顺序保存性质 dict 物体 has been declared 作为Python语言规范的正式部分。
标准库的重大改进:
这个
asyncio
模块已收到新功能,具有重要意义 usability and performance improvements .这个
time
模块获得支持 functions with nanosecond resolution .
CPython实施改进:
避免使用ASCII作为默认文本编码:
PEP 552 ,确定性.pycs
PEP 565 ,改进
DeprecationWarning
处理
C API改进:
PEP 539 ,用于线程本地存储的新C API
文件改进:
这个版本在许多方面都有显著的性能改进。这个 优化 部分详细列出了它们。
有关可能影响与早期Python版本兼容性的更改列表,请参阅 移植到python 3.7 部分。
新特点¶
PEP 563:注释的延期评估¶
python中类型提示的出现揭示了两个突出的可用性问题,即添加注释的功能。 PEP 3107 并进一步完善 PEP 526 :
注释只能使用当前作用域中已经可用的名称,换句话说,它们不支持任何类型的前向引用;并且
注释源代码对python程序的启动时间有不利影响。
这两个问题都是通过推迟注释的评估来解决的。编译器不编译在定义时在注释中执行表达式的代码,而是将注释以字符串形式存储,该字符串形式等同于所讨论表达式的ast。如果需要,可以在运行时使用 typing.get_type_hints()
.在不需要这样做的常见情况下,注释存储起来更便宜(因为短字符串由解释器内部保存),并且使启动时间更快。
可用性方面,注释现在支持前向引用,使以下语法有效:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
由于这种更改破坏了兼容性,因此需要在Python3.7中使用 __future__
输入:
from __future__ import annotations
它将成为Python3.10中的默认值。
参见
- PEP 563 --批注的延迟评估
PEP由_Ukasz Langa编写和实施。
PEP 538:传统C区域强制¶
python 3系列中的一个持续的挑战是确定一个明智的默认策略来处理“7位ascii”文本编码假设,当前这是在非Windows平台上使用默认的c或posix语言环境所暗示的。
PEP 538 更新默认的解释器命令行接口,自动将该区域设置强制为基于utf-8的可用区域设置,如新文档中所述 PYTHONCOERCECLOCALE
环境变量。自动设置 LC_CTYPE
这意味着核心解释器和支持区域设置的C扩展(例如 readline
)将假定使用UTF-8作为默认文本编码,而不是使用ASCII。
中的平台支持定义 PEP 11 也被更新为将全文处理支持限制为适当配置的非基于ASCII的区域设置。
作为此更改的一部分,的默认错误处理程序 stdin
和 stdout
现在是 surrogateescape
(而不是 strict
)使用任何定义的强制目标区域设置时(当前 C.UTF-8
, C.utf8
和 UTF-8
)的默认错误处理程序 stderr
继续 backslashreplace
,不考虑区域设置。
默认情况下,区域设置强制是无声的,但为了帮助调试可能与区域设置相关的集成问题,显式警告(直接在 stderr
)可通过设置请求 PYTHONCOERCECLOCALE=warn
. 如果旧的C语言环境在核心解释器初始化时保持活动状态,此设置还将导致python运行时发出警告。
同时 PEP 538 的区域设置强制还可以影响扩展模块(如GNU) readline
以及子进程(包括运行非Python应用程序和旧版本的Python的进程),它的缺点是要求在运行的系统上存在合适的目标区域设置。为了更好地处理没有合适的目标区域设置的情况(例如,在RHEL/CentOS 7上发生的情况),python 3.7还实现了 PEP 540:强制UTF-8运行时模式 .
参见
- PEP 538 --将旧的C区域设置强制为基于UTF-8的区域设置
PEP由Nick Coghlan编写并实施。
PEP 540:强制UTF-8运行时模式¶
新的 -X
utf8
命令行选项和 PYTHONUTF8
环境变量可用于启用 Python UTF-8 Mode 。
在UTF-8模式下,cpython忽略区域设置,默认情况下使用UTF-8编码。的错误处理程序 sys.stdin
和 sys.stdout
流设置为 surrogateescape
.
强制的UTF-8模式可以用来更改嵌入的Python解释器中的文本处理行为,而无需更改嵌入应用程序的区域设置。
同时 PEP 540 的utf-8模式具有工作的好处,不管运行系统上有哪些可用的区域设置,它的缺点是对扩展模块(如GNU)没有影响 readline
,运行非python应用程序的子进程,以及运行旧版本python的子进程。为了降低与这些组件通信时损坏文本数据的风险,python 3.7还实现了 PEP 540:强制UTF-8运行时模式 )
当区域设置为 C
或 POSIX
和 PEP 538 区域设置强制功能无法将其更改为基于UTF-8的替代项(无论该失败是否由于 PYTHONCOERCECLOCALE=0
被设定, LC_ALL
正在设置,或缺少合适的目标区域设置)。
参见
- PEP 540 --添加新的UTF-8模式
由Victor Stinner编写和实现
PEP 553:内置 breakpoint()
¶
python 3.7包含了新的内置 breakpoint()
作为进入Python调试器的一种简单而一致的方法。
内置的 breakpoint()
调用 sys.breakpointhook()
. 默认情况下,后者导入 pdb
然后调用 pdb.set_trace()
,但通过绑定 sys.breakpointhook()
为了你的选择, breakpoint()
可以输入任何调试器。此外,环境变量 PYTHONBREAKPOINT
可以设置为所选调试器的可调用项。集合 PYTHONBREAKPOINT=0
完全禁用内置 breakpoint()
.
参见
- PEP 553 --内置断点()
由巴里·华沙编写和实现
PEP 539:用于线程本地存储的新C API¶
而python为线程本地存储支持提供了C API;现有的 Thread Local Storage (TLS) API 已使用 int 在所有平台上表示TLS密钥。对于正式的支持平台来说,这通常不是一个问题,但是这既不符合POSIX,也不具有任何实际意义上的可移植性。
PEP 539 通过提供新的 Thread Specific Storage (TSS) API 替换cpython解释器中现有tls api的cpython,同时弃用现有api。TSS API使用新类型 Py_tss_t
而不是 int 表示TSS密钥——一种不透明的类型,其定义可能取决于底层的TLS实现。因此,这将允许在以无法安全地强制转换到的方式定义本机TLS密钥的平台上构建CPython。 int .
请注意,在以无法安全地强制转换到的方式定义本机TLS密钥的平台上 int ,现有的tls api的所有函数都将是no op并立即返回failure。这清楚地表明,旧的API在不能可靠使用的平台上不受支持,并且不会努力添加这种支持。
参见
- PEP 539 --cpython中线程本地存储的新C-API
由Erik M.Bray编写的PEP;由Yamayuki Yamamoto实施。
PEP 562:模块属性访问的自定义¶
python 3.7允许定义 __getattr__()
并将在未找到模块属性时调用它。定义 __dir__()
现在也允许在模块上。
其中一个可能有用的典型例子是模块属性取消预测和延迟加载。
参见
- PEP 562 -- Module
__getattr__
and__dir__
由Ivan Levkivskyi编写和实现
PEP 564:纳秒分辨率的新时间函数¶
现代系统中时钟的分辨率可以超过由 time.time()
函数及其变体。为了避免精度损失, PEP 564 将现有计时器函数的六个新“纳秒”变量添加到 time
模块:
新函数将纳秒数作为整数值返回。
Measurements 在Linux和Windows上显示 time.time_ns()
大约是 time.time()
.
参见
- PEP 564 --添加具有纳秒分辨率的新时间函数
由Victor Stinner编写和实现
PEP 565:显示DeprecationWarning 在``__main__``中¶
默认处理 DeprecationWarning
已更改,以便在默认情况下再次显示这些警告,但仅当触发这些警告的代码直接在 __main__
模块。因此,单文件脚本的开发人员和交互使用python的开发人员应该再次看到他们所使用的API的拒绝警告,但是由导入的应用程序、库和框架模块触发的拒绝警告在默认情况下将继续隐藏。
由于这种变化,标准库现在允许开发人员在三种不同的拒绝警告行为之间进行选择:
FutureWarning
:默认情况下始终显示,建议应用程序最终用户看到的警告(例如,对于不推荐使用的应用程序配置设置)。DeprecationWarning
:默认情况下仅显示在__main__
当运行测试时,建议其他Python开发人员看到警告,在这些警告中,版本升级可能导致行为改变或错误。PendingDeprecationWarning
:仅在运行测试时默认显示,用于将来版本升级将警告类别更改为的情况DeprecationWarning
或FutureWarning
.
以前两者 DeprecationWarning
和 PendingDeprecationWarning
只有在运行测试时才可见,这意味着主要编写单文件脚本或交互使用Python的开发人员可能会对中断所使用的API中的更改感到惊讶。
参见
- PEP 565 -- Show DeprecationWarning in
__main__
由Nick Coghlan编写和实现
PEP 560:核心支持 typing
模块和通用类型¶
最初 PEP 484 其设计方式不会引入 any 对核心cpython解释器的更改。现在键入提示和 typing
模块被社区广泛使用,因此这一限制被取消。PEP介绍了两种特殊的方法 __class_getitem__()
和 __mro_entries__
中的大多数类和特殊构造现在都使用这些方法 typing
. 因此,各种类型操作的速度提高了7倍,通用类型可以在没有元类冲突的情况下使用,并且在 typing
模块是固定的。
参见
- PEP 560 --对类型模块和泛型类型的核心支持
由Ivan Levkivskyi编写和实现
PEP552:基于hash的.pyc文件¶
传统上,python会检查字节码缓存文件的最新版本(即, .pyc
文件)通过将源元数据(上次修改的时间戳和大小)与生成时保存在缓存文件头中的源元数据进行比较。这种失效方法虽然有效,但也有其缺点。当文件系统时间戳太粗糙时,python可能会错过源代码更新,从而导致用户混淆。此外,缓存文件中的时间戳对于 build reproducibility 以及基于内容的构建系统。
PEP 552 扩展pyc格式以允许源文件的散列用于无效化,而不是源时间戳。这样 .pyc
文件称为“基于hash”。默认情况下,python仍然使用基于时间戳的无效化,并且不生成基于hash的 .pyc
运行时的文件。基于hash的 .pyc
文件可以用 py_compile
或 compileall
.
基于hash的 .pyc
文件有两种变体:选中和未选中。python验证基于检查hash的 .pyc
运行时针对相应源文件的文件,但不针对未选中的基于hash的Pyc执行此操作。未选中的基于hash的 .pyc
对于由Python外部的系统(例如,构建系统)负责保存的环境,文件是一种有用的性能优化。 .pyc
最新文件。
见 缓存字节码无效 更多信息。
参见
- PEP 552 --确定性Pycs
由Benjamin Peterson编写和实现
PEP 545:python文档翻译¶
PEP 545 描述创建和维护Python文档翻译的过程。
增加了三个新翻译:
Japanese: https://docs.python.org/ja/
French: https://docs.python.org/fr/
Korean: https://docs.python.org/ko/
参见
- PEP 545 --python文档翻译
PEP由Julien Palard、Inada Naoki和Victor Stinner编写并实施。
Python开发模式(-X dev)¶
新的 -X
dev
命令行选项或新的 PYTHONDEVMODE
环境变量可用于启用 Python Development Mode . 在开发模式下,Python会执行额外的运行时检查,这些检查的成本太高,默认情况下无法启用。见 Python Development Mode 完整描述的文档。
其他语言更改¶
安
await
包含async for
子句在中的表达式中是非法的 formatted string literals 因为执行过程中的问题。在Python3.7中,这个限制被解除了。现在可以向一个函数传递超过255个参数,一个函数现在可以有超过255个参数。(Serhiy Storchaka在 bpo-12844 和 bpo-18896 )
bytes.fromhex()
和bytearray.fromhex()
现在忽略所有的ASCII空白,而不仅仅是空格。(罗伯特·肖恩供稿) bpo-28927 )str
,bytes
和bytearray
为新产品赢得支持isascii()
方法,该方法可用于测试字符串或字节是否只包含ASCII字符。(Inada Naoki在 bpo-32677 )ImportError
现在显示模块名称和模块__file__
path whenfrom ... import ...
失败。(由Matthias Bussonnier在 bpo-29546 )现在支持循环导入,包括将子模块绑定到名称的绝对导入。(Serhiy Storchaka在 bpo-30024 )
object.__format__(x, '')
现在等于str(x)
而不是format(str(self), '')
. (Serhiy Storchaka在 bpo-28974 )为了更好地支持动态创建堆栈跟踪,
types.TracebackType
现在可以从python代码实例化,tb_next
属性对 tracebacks 现在可写。(Nathaniel J.Smith在 bpo-30579 )当使用
-m
开关,sys.path[0]
现在迫切地扩展到完整的起始目录路径,而不是保留为空目录(允许从 现在的 导入时的工作目录(由Nick Coghlan在 bpo-33053 )新的
-X
importtime
选项或PYTHONPROFILEIMPORTTIME
环境变量可用于显示每个模块导入的时间。(由Victor Stinner在 bpo-31415 )
新模块¶
上下文变量¶
新的 contextvars
模块和一套 new C APIs 介绍对的支持 上下文变量 . 上下文变量在概念上类似于线程局部变量。与TLS不同,上下文变量正确支持异步代码。
这个 asyncio
和 decimal
模块已经更新,可以使用和支持开箱即用的上下文变量。尤其是活动的十进制上下文现在存储在一个上下文变量中,它允许十进制操作在异步代码中使用正确的上下文。
参见
- PEP 567 --上下文变量
由Yury Selivanov编写和实现
数据包¶
新的 dataclass()
decorator提供了一种声明 数据类 . 数据类使用类变量注释描述其属性。它的构造函数和其他神奇的方法,例如 __repr__()
, __eq__()
和 __hash__()
自动生成。
例子::
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
参见
- PEP 557 --数据类
由Eric V.Smith编写和实现
importlib.resources¶
新的 importlib.resources
模块提供了几个新的API和一个新的ABC,用于访问、打开和阅读 资源 封装内。资源与包中的文件大致相似,但它们不必是物理文件系统上的实际文件。模块加载器可以提供 get_resource_reader()
返回一个 importlib.abc.ResourceReader
实例以支持此新API。内置的文件路径加载器和zip文件加载器都支持这一点。
巴里·华沙和布雷特·坎农在 bpo-32248 .
参见
importlib_resources --用于早期Python版本的pypi后端。
改进的模块¶
argparse¶
新的 ArgumentParser.parse_intermixed_args()
方法允许混合使用选项和位置参数。(由Paul.J3于 bpo-14191 )
asyncio¶
这个 asyncio
模块已经收到许多新的功能、可用性和 performance improvements .显著变化包括:
新的 provisional
asyncio.run()
函数可以通过自动创建和销毁事件循环来从同步代码运行协程。(由Yury Selivanov在 bpo-32314 )Asyncio获得了对
contextvars
.loop.call_soon()
,loop.call_soon_threadsafe()
,loop.call_later()
,loop.call_at()
和Future.add_done_callback()
只有新的可选关键字 context 参数。Tasks
现在自动跟踪他们的上下文。见 PEP 567 了解更多详细信息。(由Yury Selivanov在 bpo-32436 )新的
asyncio.create_task()
函数已作为快捷方式添加到asyncio.get_event_loop().create_task()
. (由Andrew Svetlov在 bpo-32311 )新的
loop.start_tls()
方法可用于将现有连接升级到TLS。(由Yury Selivanov在 bpo-23749 )新的
loop.sock_recv_into()
方法允许将数据从套接字直接读取到提供的缓冲区中,从而可以减少数据副本。(由Antoine Pitrou在 bpo-31819 )新的
asyncio.current_task()
函数返回当前正在运行的Task
实例,以及新的asyncio.all_tasks()
函数返回一组所有现有的Task
给定循环中的实例。这个Task.current_task()
和Task.all_tasks()
方法已被弃用。(由Andrew Svetlov在 bpo-32250 )新的 临时的
BufferedProtocol
类允许通过对接收缓冲区的手动控制来实现流协议。(由Yury Selivanov在 bpo-32251 )新的
asyncio.get_running_loop()
函数返回当前正在运行的循环,并引发RuntimeError
如果没有循环运行。这与asyncio.get_event_loop()
,将 创造 如果没有运行,则返回新的事件循环。(由Yury Selivanov在 bpo-32269 )新的
StreamWriter.wait_closed()
协程方法允许等待流编写器关闭。新的StreamWriter.is_closing()
方法可用于确定编写器是否正在关闭。(由Andrew Svetlov在 bpo-32391 )新的
loop.sock_sendfile()
协程方法允许使用os.sendfile
如果可能的话。(由Andrew Svetlov在 bpo-32410 )新的
Future.get_loop()
和Task.get_loop()
方法返回在其上创建任务或未来的循环的实例。Server.get_loop()
允许对asyncio.Server
物体。(由Yury Selivanov在 bpo-32415 而斯里尼瓦斯雷迪,也就是我的同龄人 bpo-32418 )现在可以控制
asyncio.Server
开始服务。以前,服务器在创建时会立即开始服务。新的 start_serving 关键字参数loop.create_server()
和loop.create_unix_server()
以及Server.start_serving()
和Server.serve_forever()
可以用来分离服务器的实例化和服务。新的Server.is_serving()
方法返回True
如果服务器正在服务。Server
对象现在是异步上下文管理器::srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(由Yury Selivanov在 bpo-32662 )
由返回的回调对象
loop.call_later()
获得新的when()
方法,该方法返回一个绝对预定的回调时间戳。(由Andrew Svetlov在 bpo-32741 )这个
loop.create_datagram_endpoint()
方法获得了对Unix套接字的支持。(由Quentin Dawans在 bpo-31245 )这个
asyncio.open_connection()
,asyncio.start_server()
功能,loop.create_connection()
,loop.create_server()
,loop.create_accepted_socket()
方法及其相应的Unix套接字变体现在接受 ssl_handshake_timeout 关键字参数。(尼尔·阿斯皮纳尔在 bpo-29970 )新的
Handle.cancelled()
方法返回True
如果取消了回调。(由Marat Sharafuttinov在 bpo-31943 )新的
ReadTransport.is_reading()
方法可用于确定传输的读取状态。此外,调用ReadTransport.resume_reading()
和ReadTransport.pause_reading()
现在是等幂的。(由Yury Selivanov在 bpo-32356 )接受套接字路径的循环方法现在支持传递 path-like objects . (由Yury Selivanov在 bpo-32066 )
在
asyncio
Linux上的TCP套接字现在是用TCP_NODELAY
默认设置的标志。(由Yury Selivanov和Victor Stinner在 bpo-27456 )已取消任务中发生的异常不再记录。(由Yury Selivanov在 bpo-30508 )
新的
WindowsSelectorEventLoopPolicy
和WindowsProactorEventLoopPolicy
类。(由Yury Selivanov在 bpo-33792 )
几个 asyncio
API已被 deprecated .
binascii¶
这个 b2a_uu()
函数现在接受一个可选的 backtick 关键字参数。当它为真时,零表示为 '`'
而不是空格。(由张翔于 bpo-30103 )
日历¶
这个 HTMLCalendar
类具有新的类属性,可以方便地在生成的HTML日历中自定义CSS类。(由Oz Tiram在 bpo-30095 )
收藏¶
collections.namedtuple()
现在支持默认值。(由Raymond Hettinger在 bpo-32320 )
编译所有¶
compileall.compile_dir()
学会了新的 invalidation_mode 参数,可用于启用 hash-based .pyc invalidation .也可以在命令行上使用新的 --invalidation-mode
参数。(本杰明·彼得森于 bpo-31650 )
concurrent.futures¶
ProcessPoolExecutor
和 ThreadPoolExecutor
现在支持新的 初始化器 和 伊尼塔格斯 构造函数参数。(由Antoine Pitrou在 bpo-21423 )
这个 ProcessPoolExecutor
现在可以通过新的 mp_context 参数。(由Thomas Moreau在 bpo-31540 )
contextlib¶
新的 nullcontext()
是一个简单和快速的无操作上下文管理器 ExitStack
. (由Jesse Bakker在 bpo-10049 )
新的 asynccontextmanager()
, AbstractAsyncContextManager
和 AsyncExitStack
已添加以补充它们的同步对应项。(由Jelle Zijlstra在 bpo-29679 和 bpo-30241 亚历山大·莫尔和伊利亚·库拉科夫 bpo-29302 )
cProfile¶
这个 cProfile
命令行现在接受 -m module_name
作为脚本路径的替代。(由Sanyam Khurana在 bpo-21862 )
crypt¶
日期时间¶
新的 datetime.fromisoformat()
方法构造 datetime
对象,该对象来自输出格式之一的字符串 datetime.isoformat()
. (由Paul Ganssle在 bpo-15873 )
数据库管理¶
dbm.dumb
现在支持只读文件的读取,并且在索引文件未更改时不再写入索引文件。
十进制的¶
这个 decimal
模块现在使用 context variables 存储十进制上下文。(由Yury Selivanov在 bpo-32630 )
数字化信息系统¶
这个 dis()
函数现在可以分解嵌套的代码对象(理解代码、生成器表达式和嵌套函数,以及用于构建嵌套类的代码)。反汇编递归的最大深度由新的 深度 参数。(Serhiy Storchaka在 bpo-11822 )
distutils¶
README.rst
现在包含在distuils标准自述文件列表中,因此包含在源发行版中。(由Ryan Gonzalez在 bpo-11913 )
枚举¶
这个 Enum
学会了新的 _ignore_
类属性,它允许列出不应成为枚举成员的属性的名称。(伊桑·弗曼在 bpo-31801 )
在python 3.8中,尝试在 Enum
课程将提高 TypeError
(例如) 1 in Color
);同样,尝试检查 Flag
会员将提高 TypeError
(例如) 1 in Perm.RW
);当前,两个操作都返回 False
相反,和被弃用。(伊桑·弗曼在 bpo-33217 )
功能工具¶
functools.singledispatch()
现在支持使用类型注释注册实现。(由Ukasz Langa在 bpo-32227 )
GC¶
新的 gc.freeze()
函数允许冻结垃圾收集器跟踪的所有对象,并将其从将来的集合中排除。这可以在posix之前使用 fork()
调用以使gc copy-on-write更友好或加快收集速度。新的 gc.unfreeze()
函数反转此操作。此外, gc.get_freeze_count()
可用于获取冻结对象的数量。(李泽坤在 bpo-31558 )
hmac¶
这个 hmac
模块现在有一个优化的单发。 digest()
功能,比 HMAC()
. (由Christian Heimes在 bpo-32433 )
http.client¶
HTTPConnection
和 HTTPSConnection
现在支持新的 块状 提高上传吞吐量的理由。(Nir Soffer在 bpo-31945 )
http.server¶
SimpleHTTPRequestHandler
现在支持HTTP If-Modified-Since
标题。如果目标文件在头中指定的时间之后未被修改,服务器将返回304响应状态。(由Pierre Quentel在 bpo-29654 )
SimpleHTTPRequestHandler
接受新 目录 参数,除了新的 --directory
命令行参数。使用此参数,服务器将为指定的目录提供服务,默认情况下,它使用当前工作目录。(由圣潘·威特尔和朱利安·帕拉德于 bpo-28707 )
新的 ThreadingHTTPServer
类使用线程处理请求 ThreadingMixin
. 使用时 http.server
运行与 -m
. (朱利安帕拉德在 bpo-31639 )
idlelib和idle¶
自动完成的多个修复程序。(由路易路在 bpo-15786 )
模块浏览器(在文件菜单上,以前称为类浏览器),现在除了顶级函数和类之外,还显示嵌套函数和类。(由Guilherme Polo、Cheryl Sabella和Terry Jan Reedy在 bpo-1612262 )
设置对话框(选项、配置空闲)已部分重写,以改善外观和功能。(Cheryl Sabella和Terry Jan Reedy在多个问题上作了贡献。)
字体示例现在包括非拉丁字符的选择,这样用户可以更好地看到选择特定字体的效果。(由Terry Jan Reedy在 bpo-13802 .)可以编辑样本以包含其他字符。(Serhiy Storchaka在 bpo-31860 )
以前作为扩展实现的空闲特性已经作为普通特性重新实现。它们的设置已从扩展选项卡移到其他对话框选项卡。(由Charles Wohlganger和Terry Jan Reedy在 bpo-27099 )
编辑代码上下文选项已修订。框显示所有上下文行,最多可显示最大行。单击上下文行会将编辑器跳到该行。自定义主题的上下文颜色将添加到“设置”对话框的“突出显示”选项卡中。(由Cheryl Sabella和Terry Jan Reedy在 bpo-33642 , bpo-33768 和 bpo-33679 )
在Windows上,一个新的API调用告诉Windows tk为dpi缩放。在Windows8.1+或10上,python二进制文件的dpi兼容性属性保持不变,并且监视器分辨率大于96dpi,这将使文本和行更清晰。否则应该没有效果。(由Terry Jan Reedy在 bpo-33656 )
3.7.1中的新内容:
N行上的输出(默认为50)被压缩为一个按钮。n可以在设置对话框的常规页面的pyshell部分更改。用鼠标右键单击输出可以压缩的行更少,但也可能更长。通过双击按钮或右键单击按钮进入剪贴板或单独的窗口,可以就地扩展压缩输出。(由Tal Einat在 bpo-1529353 )
以上更改已返回到3.6维护版本。
3.7.4新增:
将“运行自定义”添加到“运行”菜单以运行具有自定义设置的模块。输入的任何命令行参数都将添加到sys.argv。它们将重新出现在下一次自定义运行的框中。也可以抑制正常的Shell主模块重启。(由Cheryl Sabella、Terry Jan Reedy和其他 bpo-5680 和 bpo-37627 )
3.7.5中的新功能:
为空闲编辑器窗口添加可选行号。除非在“配置”对话框的“常规”选项卡中另有设置,否则窗口将不带行号打开。现有窗口的行号将显示并隐藏在“选项”菜单中。(Tal Einat和Saimadhav Heblikar在 bpo-17535 )
importlib¶
这个 importlib.abc.ResourceReader
引入ABC来支持从包中加载资源。也见 importlib.resources . (巴里·华沙,布雷特·坎农在 bpo-32248 )
importlib.reload()
现在提出 ModuleNotFoundError
如果模块缺少规格(由Garvit Khatri在 bpo-29851 )
importlib.find_spec()
现在提出 ModuleNotFoundError
而不是 AttributeError
如果指定的父模块不是包(即缺少 __path__
属性)。(米兰奥伯基赫在 bpo-30436 )
新的 importlib.source_hash()
可用于计算传递源的hash。一 hash-based .pyc file 嵌入此函数返回的值。
输入输出¶
新的 TextIOWrapper.reconfigure()
方法可用于用新设置重新配置文本流。(由Antoine Pitrou在 bpo-30526 和稻田直木在 bpo-15216 )
IP地址¶
新的 subnet_of()
和 supernet_of()
方法 ipaddress.IPv6Network
和 ipaddress.IPv4Network
可用于网络包含测试。(Michel Albert和Cheryl Sabella在 bpo-20825 )
迭代工具¶
itertools.islice()
现在接受 integer-like objects
作为开始、停止和切片参数。(由威尔·罗伯茨在 bpo-30537 )
locale¶
新的 monetary 参数 locale.format_string()
可用于使转换使用货币千位分隔符和分组字符串。(由Garvit在 bpo-10379 )
这个 locale.getpreferredencoding()
函数现在总是返回 'UTF-8'
在Android上或在 forced UTF-8 mode .
登录¶
Logger
现在可以酸洗实例。(由Vinay Sajip在 bpo-30520 )
新的 StreamHandler.setStream()
方法可用于在创建处理程序后替换记录器流。(由Vinay Sajip在 bpo-30522 )
现在可以在传递给的配置中为处理程序构造函数指定关键字参数。 logging.config.fileConfig()
. (由Preston Landers在 bpo-31080 )
数学¶
新的 math.remainder()
函数实现IEEE754样式的余数操作。(马克·狄金森在 bpo-29962 )
拟态¶
.bmp的mime类型已从更改为 'image/x-ms-bmp'
到 'image/bmp'
. (由Nitish Chandra在 bpo-22589 )
msilib¶
新的 Database.Close()
方法可用于关闭 MSI 数据库。(由Berker Peksag在 bpo-20486 )
多重处理¶
新的 Process.close()
方法显式关闭流程对象并释放与其关联的所有资源。 ValueError
如果基础进程仍在运行,则引发。(由Antoine Pitrou在 bpo-30596 )
新的 Process.kill()
方法可用于使用 SIGKILL
Unix上的信号。(由Vitor Pereira在 bpo-30794 )
操作系统¶
os.fwalk()
现在接受 path 论证为 bytes
. (Serhiy Storchaka在 bpo-28682 )
os.scandir()
获得支持 file descriptors . (Serhiy Storchaka在 bpo-25996 )
新的 register_at_fork()
函数允许在进程复刻处执行注册python回调。(由Antoine Pitrou在 bpo-16500 )
补充 os.preadv()
(结合 os.readv()
和 os.pread()
) os.pwritev()
功能(结合 os.writev()
和 os.pwrite()
)。(Pablo Galindo在 bpo-31368 )
模式参数 os.makedirs()
不再影响新创建的中间级目录的文件权限位。(Serhiy Storchaka在 bpo-19930 )
os.dup2()
现在返回新的文件描述符。以前, None
总是返回。(本杰明·彼得森于 bpo-32441 )
返回的结构 os.stat()
现在包含 st_fstype
Solaris及其派生产品的属性。(由Jes_s Cea Avi_n在 bpo-32659 )
pathlib¶
新的 Path.is_mount()
方法现在在POSIX系统上可用,可以用来确定路径是否是装入点。(由Cooper Ry Lees在 bpo-30897 )
pdb¶
pdb.set_trace()
现在选择一个选项 *header*仅关键字参数。如果给定,它将在调试开始前打印到控制台。(巴里·华沙在 bpo-31389 )
py_compile¶
py_compile.compile()
--再进一步说, compileall
--现在尊重 SOURCE_DATE_EPOCH
无条件创建的环境变量 .pyc
用于基于hash的验证的文件。这样可以保证 reproducible builds 属于 .pyc
当文件被急切地创建时。(由Bernhard M.Wiedemann于 bpo-29708 )
pydoc¶
Pydoc服务器现在可以绑定到由新的 -n
命令行参数。(Feanil Patel在 bpo-31128 )
队列¶
新的 SimpleQueue
类是无边界的 FIFO 排队。(由Antoine Pitrou在 bpo-14976 )
重新¶
flag re.ASCII
, re.LOCALE
和 re.UNICODE
可以在组范围内设置。(Serhiy Storchaka在 bpo-31690 )
re.split()
现在支持像 r'\b'
, '^$'
或 (?=-)
与空字符串匹配。(Serhiy Storchaka在 bpo-25054 )
用编译的正则表达式 re.LOCALE
标志在编译时不再依赖于区域设置。仅当使用已编译的正则表达式时才应用区域设置。(Serhiy Storchaka在 bpo-30215 )
FutureWarning
如果正则表达式包含将来会发生语义变化的字符集构造(如嵌套集和集操作),则现在发出。(Serhiy Storchaka在 bpo-30349 )
现在可以使用 copy.copy()
和 copy.deepcopy()
. (Serhiy Storchaka在 bpo-10076 )
信号¶
新的 warn_on_full_buffer 参数 signal.set_wakeup_fd()
函数使指定当唤醒缓冲区溢出时,python是否在stderr上打印警告成为可能。(Nathaniel J.Smith在 bpo-30050 )
Socket¶
新的 socket.getblocking()
方法返回 True
如果Socket处于阻塞模式,并且 False
否则。(由Yury Selivanov在 bpo-32373 )
新的 socket.close()
函数关闭传递的套接字文件描述符。应使用此函数而不是 os.close()
以便在不同平台之间实现更好的兼容性。(由Christian Heimes在 bpo-32454 )
这个 socket
模块现在显示 socket.TCP_CONGESTION
(Linux 2.613) socket.TCP_USER_TIMEOUT
(Linux 2.6.37),以及 socket.TCP_NOTSENT_LOWAT
(Linux 3.12)常量。(奥马尔·桑多瓦尔在 bpo-26273 纳撒尼尔J史密斯在 bpo-29728 )
支持 socket.AF_VSOCK
已添加套接字以允许虚拟机与其主机之间进行通信。(由凯西·艾弗里在 bpo-27584 )
默认情况下,套接字现在从文件描述符自动检测族、类型和协议。(由Christian Heimes在 bpo-28134 )
socketserver¶
socketserver.ThreadingMixIn.server_close()
现在等待所有非守护进程线程完成。 socketserver.ForkingMixIn.server_close()
现在等待所有子进程完成。
添加新的 socketserver.ForkingMixIn.block_on_close
类属性到 socketserver.ForkingMixIn
和 socketserver.ThreadingMixIn
类。将class属性设置为 False
以获得3.7之前的行为。
sqlite3¶
sqlite3.Connection
现在暴露 backup()
方法,当基础sqlite库位于3.6.11或更高版本时。(Lele Gaifax在 bpo-27645 )
这个 database 的参数 sqlite3.connect()
现在接受任何 path-like object 而不仅仅是一个字符串。(安德斯·洛伦森在 bpo-31843 )
SSL¶
这个 ssl
模块现在使用OpenSSL的内置API而不是 match_hostname()
检查主机名或IP地址。在TLS握手期间验证值。任何证书验证错误(包括主机名检查失败)现在都会引发 SSLCertVerificationError
并使用适当的TLS警报消息中止握手。新的异常包含其他信息。可以使用自定义主机名验证 SSLContext.hostname_checks_common_name
. (由Christian Heimes在 bpo-31399 )
注解
改进的主机名检查需要 利比锡 实现与openssl 1.0.2或1.1兼容。因此,不再支持OpenSSL 0.9.8和1.0.1(请参见 平台支架拆除 了解更多详细信息)。SSL模块主要与libressl 2.7.2和更新版本兼容。
这个 ssl
模块不再发送sni tls扩展中的IP地址。(由Christian Heimes在 bpo-32185 )
match_hostname()
不再支持部分通配符,如 www*.example.org
. (曼德普·辛格在 bpo-23033 和基督教海默斯在 bpo-31399 )
默认的密码套件选择 ssl
模块现在使用黑名单方法,而不是硬编码白名单。python不再重新启用被openssl安全更新阻止的密码。可以在编译时配置默认的密码套件选择。(由Christian Heimes在 bpo-31429 )
现在支持验证包含国际化域名(IDN)的服务器证书。作为这一变化的一部分, SSLSocket.server_hostname
属性现在以a-label形式存储预期的主机名 ("xn--pythn-mua.org"
)而不是U-Label窗体 ("pythön.org"
)(由Nathaniel J.Smith和Christian Heimes在 bpo-28414 )
这个 ssl
模块对tls 1.3和openssl 1.1.1提供了初步和实验支持。在python 3.7.0发布时,openssl 1.1.1仍在开发中,而tls 1.3尚未最终确定。TLS 1.3握手和协议的行为与TLS 1.2及更早版本稍有不同,请参见 TLS 1.3 . (由Christian Heimes在 bpo-32947 , bpo-20995 , bpo-29136 , bpo-30622 和 bpo-33618 )
SSLSocket
和 SSLObject
不再有公共构造函数。直接实例化从来都不是文档化和支持的功能。必须使用创建实例 SSLContext
方法 wrap_socket()
和 wrap_bio()
. (由Christian Heimes在 bpo-32951 )
用于设置最小和最大TLS协议版本的openssl 1.1 API可用为 SSLContext.minimum_version
和 SSLContext.maximum_version
. 支持的协议由几个新标志表示,例如 HAS_TLSv1_1
. (由Christian Heimes在 bpo-32609 )
string¶
string.Template
现在,您可以选择分别修改有支撑的占位符和无支撑的占位符的正则表达式模式。(巴里·华沙在 bpo-1198569 )
子过程¶
这个 subprocess.run()
函数接受新的 capture_output 关键字参数。如果为真,则将捕获stdout和stderr。这相当于传球 subprocess.PIPE
作为 stdout 和 stderr 参数。(由Bo Bayles于 bpo-32102 )
这个 subprocess.run
函数和 subprocess.Popen
构造函数现在接受 text 作为别名的关键字参数 universal_newlines . (安德鲁克莱格在 bpo-31756 )
在Windows上 close_fds 已从更改 False
到 True
重定向标准句柄时。现在可以设置 close_fds 重定向标准句柄时为true。见 subprocess.Popen
. 这意味着 close_fds 现在默认为 True
在所有支持的平台上。(由Segev Finer在 bpo-19764 )
子流程模块现在在处理时更加优雅 KeyboardInterrupt
在期间 subprocess.call()
, subprocess.run()
或在 Popen
上下文管理器。在继续处理 KeyboardInterrupt
例外。(格雷戈里·史密斯在 bpo-25942 )
sys¶
新的 sys.breakpointhook()
钩子函数由内置函数调用 breakpoint()
. (巴里·华沙在 bpo-31353 )
在Android上,新的 sys.getandroidapilevel()
返回生成时Android API版本。(由Victor Stinner在 bpo-28740 )
新的 sys.get_coroutine_origin_tracking_depth()
函数返回由新的 sys.set_coroutine_origin_tracking_depth()
. asyncio
已转换为使用此新API而不是弃用的 sys.set_coroutine_wrapper()
. (Nathaniel J.Smith在 bpo-32591 )
时间¶
PEP 564 将六个纳秒分辨率的新函数添加到 time
模块:
已添加新的时钟标识符:
time.CLOCK_BOOTTIME
(Linux):与相同time.CLOCK_MONOTONIC
,但也包括系统挂起的任何时间。time.CLOCK_PROF
(freebsd、netbsd和openbsd):每个进程的高分辨率CPU计时器。time.CLOCK_UPTIME
(freebsd,openbsd):其绝对值是系统已运行且未挂起的时间,提供准确的正常运行时间测量。
新的 time.thread_time()
和 time.thread_time_ns()
函数可用于获取每个线程的CPU时间度量。(由Antoine Pitrou在 bpo-32025 )
新的 time.pthread_getcpuclockid()
函数返回线程特定的CPU时间时钟的时钟ID。
tkinter¶
新的 tkinter.ttk.Spinbox
现在可以上课了。(艾伦·摩尔在 bpo-32585 )
tracemalloc¶
tracemalloc.Traceback
其行为更像常规的回溯,从最早的帧到最新的帧进行排序。 Traceback.format()
现在接受否定 limit ,将结果截断为 abs(limit)
最旧的帧。要获得旧的行为,使用新的 most_recent_first 参数 Traceback.format()
. (由Jesse Bakker在 bpo-32121 )
类型¶
新的 WrapperDescriptorType
, MethodWrapperType
, MethodDescriptorType
和 ClassMethodDescriptorType
现在可以上课了。(由Manuel Krebber和Guido van Rossum在 bpo-29377 和Serhiy Storchaka在 bpo-32265 )
新的 types.resolve_bases()
函数根据指定动态解析MRO条目 PEP 560 . (Ivan Levkivskyi在 bpo-32717 )
unicodedata¶
内部 unicodedata
数据库已升级为使用 Unicode 11 . (本杰明·彼得森供稿)
单元测试¶
新的 -k
命令行选项允许按名称子字符串或类似于unix shell的模式筛选测试。例如, python -m unittest -k foo
运行 foo_tests.SomeTest.test_something
, bar_tests.SomeTest.test_foo
,但不是 bar_tests.FooTest.test_something
. (乔纳斯·哈格在 bpo-32071 )
unittest.mock¶
这个 sentinel
属性现在保留它们的身份 copied
或 pickled
. (Serhiy Storchaka在 bpo-20804 )
新的 seal()
功能允许密封 Mock
实例,这将不允许进一步创建属性模拟。密封将递归地应用于所有本身是模拟的属性。(马里奥·科切罗在 bpo-30541 )
urllib.parse¶
urllib.parse.quote()
已从更新 RFC 2396 到 RFC 3986 添加 ~
默认情况下从不引用的字符集。(由Christian Theune和Ratnadeep Debnath在 bpo-16285 )
uu¶
这个 uu.encode()
函数现在接受一个可选的 backtick 关键字参数。当它为真时,零表示为 '`'
而不是空格。(由张翔于 bpo-30103 )
uuid¶
新的 UUID.is_safe
属性从平台传递有关生成的UUID是否使用多处理安全方法生成的信息。(巴里·华沙在 bpo-22807 )
uuid.getnode()
现在更类似于通用管理的MAC地址,而不是本地管理的MAC地址。这可以更好地保证从返回的UUID的全局唯一性。 uuid.uuid1()
.如果只有本地管理的MAC地址可用,则返回找到的第一个此类地址。(巴里·华沙在 bpo-32107 )
警告¶
默认警告筛选器的初始化已更改如下:
通过命令行选项启用的警告(包括
-b
以及新的特定于cpython的-X
dev
选项)始终通过sys.warnoptions
属性。通过命令行或环境启用的警告筛选器现在具有以下优先顺序:
这个
BytesWarning
滤波器-b
(或)-bb
)使用指定的任何筛选器
-W
选项使用指定的任何筛选器
PYTHONWARNINGS
环境变量任何其他特定的CPython过滤器(例如
default
为新添加的筛选器-X dev
模式)任何由警告机制直接定义的隐式过滤器
在cpython调试版本中,现在默认情况下显示所有警告(隐式筛选器列表为空)
(由Nick Coghlan和Victor Stinner在 bpo-20361 , bpo-32043 和 bpo-32230 )
默认情况下,在单个文件脚本和交互式提示下,将再次显示拒绝警告。见 PEP 565:显示DeprecationWarning 在``__main__``中 详情。(由Nick Coghlan在 bpo-31975 )
xml.etree¶
ElementPath 中的谓词 find()
方法现在可以将当前节点的文本与 [. = "text"]
,不只是子级中的文本。谓词还允许添加空格以提高可读性。(由Stefan Behnel在 bpo-31648 )
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function
现在可以用作装饰。(由张翔于 bpo-7769 )
zipapp¶
功能 create_archive()
现在接受一个可选的 滤波器 允许用户选择哪些文件应包含在存档中的参数。(伊曼·德容在 bpo-31072 )
功能 create_archive()
现在接受一个可选的 压缩的 用于生成压缩存档的参数。命令行选项 --compress
也被添加以支持压缩。(王志明在 bpo-31638 )
压缩文件¶
ZipFile
现在接受新的 压缩能级 用于控制压缩级别的参数。(由Bo Bayles于 bpo-21417 )
由创建的存档中的子目录 ZipFile
现在按字母顺序存储。(由Bernhard M.Wiedemann于 bpo-30693 )
C API更改¶
已实现线程本地存储的新API。见 PEP 539:用于线程本地存储的新C API 概述和 线程特定存储(TSS)API 作为完整的参考。(由山本正孝于 bpo-25658 )
新的 context variables 功能公开了许多 new C APIs .
新的 PyImport_GetModule()
函数返回以前导入的具有给定名称的模块。(埃里克·斯诺在 bpo-28411 )
新的 Py_RETURN_RICHCOMPARE
宏简化了编写丰富的比较函数。(由彼得维多利亚在 bpo-23699 )
新的 Py_UNREACHABLE
宏可用于标记无法访问的代码路径。(巴里·华沙在 bpo-31338 )
这个 tracemalloc
现在通过新的 PyTraceMalloc_Track()
和 PyTraceMalloc_Untrack()
功能。(由Victor Stinner在 bpo-30054 )
新的 import__find__load__start()
和 import__find__load__done()
静态标记可用于跟踪模块导入。(由Christian Heimes在 bpo-31574 )
田地 name
和 doc
结构的 PyMemberDef
, PyGetSetDef
, PyStructSequence_Field
, PyStructSequence_Desc
和 wrapperbase
现在是类型 const char *
而不是 char *
. (Serhiy Storchaka在 bpo-28761 )
结果 PyUnicode_AsUTF8AndSize()
和 PyUnicode_AsUTF8()
现在是类型 const char *
而不是 char *
. (Serhiy Storchaka在 bpo-28769 )
结果 PyMapping_Keys()
, PyMapping_Values()
和 PyMapping_Items()
现在总是列表,而不是列表或元组。(奥伦·米尔曼在 bpo-28280 )
附加函数 PySlice_Unpack()
和 PySlice_AdjustIndices()
. (Serhiy Storchaka在 bpo-27867 )
PyOS_AfterFork()
不赞成使用新函数 PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
和 PyOS_AfterFork_Child()
. (由Antoine Pitrou在 bpo-16500 )
这个 PyExc_RecursionErrorInst
作为公共API的一部分的singleton已被删除,因为其成员从未被清除可能会在解释器完成时导致segfault。Xavier de Gaye在 bpo-22898 和 bpo-30697 .
添加了对带有时区构造函数的时区的C API支持 PyTimeZone_FromOffset()
和 PyTimeZone_FromOffsetAndName()
,并使用 PyDateTime_TimeZone_UTC
.保罗甘斯勒在 bpo-10381 .
结果的类型 PyThread_start_new_thread()
和 PyThread_get_thread_ident()
和 id 参数 PyThreadState_SetAsyncExc()
从改变 long 到 unsigned long . (Serhiy Storchaka在 bpo-6532 )
PyUnicode_AsWideCharString()
现在提出一个 ValueError
如果第二个参数是 NULL
以及 wchar_t* 字符串包含空字符。(Serhiy Storchaka在 bpo-30708 )
对启动序列的更改和动态内存分配器的管理意味着需要调用的文档化需求 Py_Initialize()
在调用大多数C API函数之前,现在对它的依赖程度更高,如果不遵守它,可能会导致嵌入应用程序中出现segfaults。见 移植到python 3.7 本文件和 在python初始化之前 有关详细信息,请参阅C API文档中的部分。
新的 PyInterpreterState_GetID()
返回给定解释器的唯一ID。(埃里克·斯诺在 bpo-29102 )
Py_DecodeLocale()
, Py_EncodeLocale()
现在使用UTF-8编码 UTF-8 mode 启用。(由Victor Stinner在 bpo-29240 )
PyUnicode_DecodeLocaleAndSize()
和 PyUnicode_EncodeLocale()
现在使用当前的区域设置编码 surrogateescape
错误处理程序。(由Victor Stinner在 bpo-29240 )
这个 开始 和 end 参数 PyUnicode_FindChar()
现在调整为类似于字符串切片的行为。(由张翔于 bpo-28822 )
建立变化¶
构建支撑 --without-threads
已删除。这个 threading
模块现在始终可用。(由Antoine Pitrou在 bpo-31370 。)
当构建 _ctypes
非OSX UNIX平台上的模块。在构建时,现在需要安装libffi的副本 _ctypes
在这样的平台上。(由Zachary Ware在 bpo-27979 )
Windows构建过程不再依赖Subversion来拉入外部源,而是使用一个Python脚本从GitHub下载ZipFile。如果在系统上找不到python 3.6(通过 py -3.6
,nuget用于下载32位python的副本。(由Zachary Ware在 bpo-30450 )
这个 ssl
模块需要与openssl 1.0.2或1.1兼容的libssl。openssl 1.0.1已于2016-12-31达到生命周期结束,不再受支持。暂时不支持libressl。版本2.6.4之前的libressl版本缺少必需的openssl 1.0.2apis。
优化¶
通过移植更多的代码来使用 METH_FASTCALL
公约。(由Victor Stinner在 bpo-29300 , bpo-29507 , bpo-29452 和 bpo-29286 )
各种优化在Linux上减少了10%的python启动时间,在MacOS上减少了30%。(由Victor Stinner,Inada Naoki在 bpo-29585 和伊万·莱夫基夫斯基 bpo-31333 )
由于字节码的更改避免了创建绑定的方法实例,方法调用现在快了20%。(由Yury Selivanov和Inada Naoki在 bpo-26110 )
这个 asyncio
模块收到了许多常用函数的显著优化:
这个
asyncio.get_event_loop()
函数已在C中重新实现,使其速度快了15倍。(由Yury Selivanov在 bpo-32296 )asyncio.Future
已优化回拨管理。(由Yury Selivanov在 bpo-32348 )asyncio.gather()
现在快了15%。(由Yury Selivanov在 bpo-32355 )asyncio.sleep()
现在速度快了2倍 延迟 参数为零或负。(由Andrew Svetlov在 bpo-32351 )降低了异步调试模式的性能开销。(由Antoine Pitrou在 bpo-31970 )
作为结果 PEP 560 work ,的导入时间 typing
已经减少了7倍,许多打字操作现在更快了。(Ivan Levkivskyi在 bpo-32226 )
sorted()
和 list.sort()
已针对常见情况进行了优化,速度可提高40-75%。(由Elliot Gorokhovsky在 bpo-28685 )
dict.copy()
现在快了5.5倍。(由Yury Selivanov在 bpo-31179 )
hasattr()
和 getattr()
现在快了4倍 name 未找到并且 obj 不重写 object.__getattr__()
或 object.__getattribute__()
.(Inada Naoki在 bpo-32544 )
在字符串中搜索某些Unicode字符(如乌克兰文大写“”)比搜索其他字符慢25倍。在最坏的情况下,现在只慢了3倍。(Serhiy Storchaka在 bpo-24821 )
这个 collections.namedtuple()
工厂已经重新实现,以使命名元组的创建速度快4到6倍。(由Jelle Zijlstra贡献,Inada Naoki、Serhiy Storchaka和Raymond Hettinger在 bpo-28638 )
date.fromordinal()
和 date.fromtimestamp()
在普通情况下,现在快了30%。(由Paul Ganssle在 bpo-32403 )
这个 os.fwalk()
由于使用了 os.scandir()
. (Serhiy Storchaka在 bpo-25996 )
的速度 shutil.rmtree()
由于使用了 os.scandir()
功能。(Serhiy Storchaka在 bpo-28564 )
优化的不区分大小写匹配和搜索 regular expressions
. 搜索一些模式现在可以快20倍。(Serhiy Storchaka在 bpo-30285 )
re.compile()
现在皈依 flags
int对象的参数(如果是) RegexFlag
.它现在和python 3.5一样快,并且比python 3.6快大约10%,这取决于模式。(Inada Naoki在 bpo-31671 )
这个 modify()
分类方法 selectors.EpollSelector
, selectors.PollSelector
和 selectors.DevpollSelector
在重负荷下可能快10%左右。(由Giampaolo Rodola在 bpo-30014 )
不断折叠已经从窥视孔优化器转移到新的AST优化器,它能够更一致地执行优化。(Eugene Toder和Inada Naoki在 bpo-29469 和 bpo-11549 )
中的大多数函数和方法 abc
已在C中重写。这将创建抽象基类,并调用 isinstance()
和 issubclass()
它们的速度快了1.5倍。这也将python的启动时间减少了10%。(Ivan Levkivskyi和Inada Naoki在 bpo-31333 )
显著提高了替代构造器的速度 datetime.date
和 datetime.datetime
在不构造子类时使用快速路径构造函数。(由Paul Ganssle在 bpo-32403 )
比较的速度 array.array
在某些情况下,实例得到了很大的改进。当比较保存相同整数类型值的数组时,它的速度现在从10倍提高到70倍。(由Adrian Wielgosik在 bpo-24700 )
这个 math.erf()
和 math.erfc()
函数现在在大多数平台上使用(更快的)C库实现。(Serhiy Storchaka在 bpo-26121 )
其他CPython实施变更¶
跟踪挂钩现在可以选择不接收
line
并选择接收opcode
通过设置相应的新f_trace_lines
和f_trace_opcodes
正在跟踪的帧上的属性。(由Nick Coghlan在 bpo-31344 )修复了命名空间包模块属性的某些一致性问题。命名空间模块对象现在具有
__file__
设置为None
(以前未设置),以及__spec__.origin
也设置为None
(之前是字符串"namespace"
)见 bpo-32305 . 另外,命名空间模块对象的__spec__.loader
设置为与相同的值__loader__
(以前,前者被设置为None
)见 bpo-32303 .这个
locals()
字典现在按词汇顺序显示变量的定义。之前,订单未定义。(由Raymond Hettinger在 bpo-32690 )这个
distutils
upload
命令不再尝试将CR行尾字符更改为CRLF。这修复了SDIST的损坏问题,SDIST以相当于cr的字节结尾(由bo bayles在 bpo-32304 )
已弃用的python行为¶
产量表达式(两个 yield
和 yield from
从句)现在在理解和生成器表达式中被弃用(最左边的iterable表达式除外) for
条款)。这确保理解总是立即返回适当类型的容器(而不是可能返回 generator iterator 对象),而生成器表达式不会尝试将其隐式输出与任何显式yield表达式的输出交错。在Python3.7中,这样的表达式会发出 DeprecationWarning
编译时,在python 3.8中,这将是 SyntaxError
. (Serhiy Storchaka在 bpo-10544 )
返回的子类 complex
从 object.__complex__()
已弃用,在将来的Python版本中将是一个错误。这使得 __complex__()
符合 object.__int__()
和 object.__float__()
. (Serhiy Storchaka在 bpo-28894 )
不推荐使用的python模块、函数和方法¶
aifc¶
aifc.openfp()
已弃用,将在python 3.9中删除。使用 aifc.open()
相反。(Brian Curtin在 bpo-31985 )
asyncio¶
直接支持 await
-的实例 asyncio.Lock
其他异步同步原语已被弃用。必须使用异步上下文管理器才能获取和释放同步资源。(由Andrew Svetlov在 bpo-32253 )
这个 asyncio.Task.current_task()
和 asyncio.Task.all_tasks()
方法已被弃用。(由Andrew Svetlov在 bpo-32250 )
收藏¶
在Python3.8中,在 collections.abc
将不再暴露在常规 collections
模块。这将有助于在具体类和抽象类之间创建更清晰的区别。(Serhiy Storchaka在 bpo-25988 )
数据库管理¶
dbm.dumb
现在支持只读文件的读取,并且在索引文件未更改时不再写入索引文件。如果索引文件在 'r'
和 'w'
模式(这在将来的Python版本中将是一个错误)。(Serhiy Storchaka在 bpo-28847 )
枚举¶
在python 3.8中,尝试在 Enum
课程将提高 TypeError
(例如) 1 in Color
);同样,尝试检查 Flag
会员将提高 TypeError
(例如) 1 in Perm.RW
);当前,两个操作都返回 False
相反。(伊桑·弗曼在 bpo-33217 )
获取文本¶
使用非整数值选择复数形式 gettext
现已弃用。它从未正确工作过。(Serhiy Storchaka在 bpo-28692 )
importlib¶
方法 MetaPathFinder.find_module()
(被替换) MetaPathFinder.find_spec()
) PathEntryFinder.find_loader()
(被替换) PathEntryFinder.find_spec()
)在python 3.4中都已弃用,现在发出 DeprecationWarning
. (由Matthias Bussonnier在 bpo-29576 )
这个 importlib.abc.ResourceLoader
ABC已被否决,赞成 importlib.abc.ResourceReader
.
locale¶
locale.format()
已弃用,请使用 locale.format_string()
相反。(由Garvit在 bpo-10379 )
macpath¶
这个 macpath
现在已弃用,将在python 3.8中删除。(由池宣彦于 bpo-9850 )
线程加工¶
dummy_threading
和 _dummy_thread
已弃用。在禁用线程的情况下,无法再构建Python。使用 threading
相反。(由Antoine Pitrou在 bpo-31370 )
Socket¶
静默参数值截断 socket.htons()
和 socket.ntohs()
已弃用。在将来的Python版本中,如果传递的参数大于16位,则会引发异常。(奥伦·米尔曼在 bpo-28332 )
SSL¶
ssl.wrap_socket()
已弃用。使用 ssl.SSLContext.wrap_socket()
相反。(由Christian Heimes在 bpo-28124 )
sunau¶
sunau.openfp()
已弃用,将在python 3.9中删除。使用 sunau.open()
相反。(Brian Curtin在 bpo-31985 )
sys¶
已弃用 sys.set_coroutine_wrapper()
和 sys.get_coroutine_wrapper()
.
无证件者 sys.callstats()
函数已被弃用,将在将来的Python版本中删除。(由Victor Stinner在 bpo-28799 )
wave¶
wave.openfp()
已弃用,将在python 3.9中删除。使用 wave.open()
相反。(Brian Curtin在 bpo-31985 )
C API的函数和类型已弃用¶
功能 PySlice_GetIndicesEx()
已弃用,并替换为宏if Py_LIMITED_API
未设置或设置为介于 0x03050400
和 0x03060000
(不包括在内),或 0x03060100
或更高。(Serhiy Storchaka在 bpo-27867 )
PyOS_AfterFork()
已弃用。使用 PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
或 PyOS_AfterFork_Child()
相反。(由Antoine Pitrou在 bpo-16500 )
平台支架拆除¶
FreeBsd 9及以上版本不再得到官方支持。
对于完整的Unicode支持,包括扩展模块内, * 尼克斯平台现在预计将至少提供
C.UTF-8
(完整区域),C.utf8
(完整区域设置)或UTF-8
(LC_CTYPE
-仅限区域设置)作为传统的替代方案ASCII
基于C
locale。不再支持openssl 0.9.8和1.0.1,这意味着在仍在使用这些版本的旧平台上使用ssl/tls支持构建cpython 3.7需要自定义构建选项,这些选项链接到较新版本的openssl。
值得注意的是,这个问题影响到Debian8(又名“Jessie”)和Ubuntu14.04(又名“Trusty”)LTS Linux发行版,因为它们默认情况下仍然使用OpenSSL1.0.1。
Debian 9(“Stretch”)和Ubuntu 16.04(“Xenial”),以及其他LTS Linux版本的最新版本(例如,RHEL/CentOS 7.5、SLES 12-SP3),使用OpenSSL 1.0.2或更高版本,并在默认构建配置中保持受支持。
CPython自己 CI configuration file 提供使用SSL的示例 compatibility testing infrastructure 在CPython的测试套件中,构建并链接到OpenSSL 1.1.0,而不是过时的系统提供的OpenSSL。
API和功能删除¶
以下特性和API已从Python3.7中删除:
这个
os.stat_float_times()
函数已被删除。它是在Python2.3中引入的,用于与Python2.2向后兼容,自Python3.1以来就被弃用了。未知的转义符包括
'\'
和替换模板中的ASCII字母re.sub()
在python 3.5中已弃用,现在将导致错误。拆下的支架 排除 参数
tarfile.TarFile.add()
. 它在python 2.7和3.2中被弃用。使用 滤波器 改为参数。这个
splitunc()
功能在ntpath
Python3.1中不推荐使用模块,现在已将其删除。使用splitdrive()
而是函数。collections.namedtuple()
不再支持 verbose 参数或_source
显示已命名元组类的生成源代码的属性。这是为加速类创建而设计的优化的一部分。(由Jelle Zijlstra贡献,Inada Naoki、Serhiy Storchaka和Raymond Hettinger在 bpo-28638 )功能
bool()
,float()
,list()
和tuple()
不再采用关键字参数。第一个参数int()
现在只能作为位置参数传递。已移除先前在python 2.4类中弃用的
Plist
,Dict
和_InternalDict
在plistlib
模块。函数结果中的dict值readPlist()
和readPlistFromBytes()
现在是普通的听写。您不能再使用属性访问来访问这些字典的项。这个
asyncio.windows_utils.socketpair()
函数已被删除。使用socket.socketpair()
相反,它在Python3.5之后的所有平台上都可用。asyncio.windows_utils.socketpair
只是一个别名socket.socketpair
在python 3.5和更新版本上。asyncio
不再导出selectors
和_overlapped
模块ASasyncio.selectors
和asyncio._overlapped
. 替换from asyncio import selectors
具有import selectors
.直接实例化
ssl.SSLSocket
和ssl.SSLObject
现在禁止使用对象。构造器从未被记录、测试或设计为公共构造器。用户应该使用ssl.wrap_socket()
或ssl.SSLContext
. (由Christian Heimes在 bpo-32951 )未使用的
distutils
install_misc
命令已被删除。(Eric N.Vander Weele在 bpo-29218 )
模块移除¶
这个 fpectl
模块已移除。它在默认情况下从来没有启用过,在x86-64上从来没有正确工作过,它以导致C扩展意外中断的方式更改了python abi。(Nathaniel J.Smith在 bpo-29137 )
仅限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将错误退出。(史蒂夫·巴恩斯在 bpo-30291 )
发射器可以运行为 py -0
要生成已安装的 Python 的列表, 带星号标记的默认值 . 运行 py -0p
将包括路径。如果使用无法匹配的版本说明符运行py,它还将打印 短格式 可用说明符列表。(史蒂夫·巴恩斯在 bpo-30362 )
移植到python 3.7¶
本节列出了前面描述的更改和可能需要更改代码的其他错误修复。
python行为的变化¶
async
和await
名称现在是保留关键字。使用这些名称作为标识符的代码现在将引发SyntaxError
. (由Jelle Zijlstra在 bpo-30406 )PEP 479 为python 3.7中的所有代码启用,这意味着
StopIteration
在协程和生成器中直接或间接引发的异常被转换为RuntimeError
例外情况。(由Yury Selivanov在 bpo-32670 )object.__aiter__()
方法不能再声明为异步。(由Yury Selivanov在 bpo-31709 )由于疏忽,早期的Python版本错误地接受了以下语法:
f(1 for x in [1],) class C(1 for x in [1]): pass
python 3.7现在正确地引发了
SyntaxError
,因为生成器表达式总是需要直接位于一组圆括号内,并且不能在两边都有逗号,并且只能在调用时省略圆括号的重复。(Serhiy Storchaka在 bpo-32012 和 bpo-32023 )当使用
-m
开关,初始工作目录现在添加到sys.path
,而不是空字符串(在每次导入时动态表示当前工作目录)。任何正在检查空字符串或依赖于以前行为的程序都需要相应地更新(例如,还需要检查os.getcwd()
或os.path.dirname(__main__.__file__)
,这取决于代码最初检查空字符串的原因)。
python api中的更改¶
socketserver.ThreadingMixIn.server_close()
现在等待所有非守护进程线程完成。设置新的socketserver.ThreadingMixIn.block_on_close
类属性到False
以获得3.7之前的行为。(由Victor Stinner在 bpo-31233 和 bpo-33540 )socketserver.ForkingMixIn.server_close()
现在等待所有子进程完成。设置新的socketserver.ForkingMixIn.block_on_close
类属性到False
以获得3.7之前的行为。(由Victor Stinner在 bpo-31151 和 bpo-33540 )这个
locale.localeconv()
函数现在临时设置LC_CTYPE
区域设置的值LC_NUMERIC
在某些情况下。(由Victor Stinner在 bpo-31900 )pkgutil.walk_packages()
现在提出一个ValueError
如果 path 是一个字符串。以前返回了空列表。(由Sanyam Khurana在 bpo-24744 )的格式字符串参数
string.Formatter.format()
现在是 positional-only . 在Python3.5中,不赞成将其作为关键字参数传递。(Serhiy Storchaka在 bpo-29193 )属性
key
,value
和coded_value
阶级的http.cookies.Morsel
现在是只读的。在python 3.5中不赞成为它们赋值。使用set()
设置它们的方法。(Serhiy Storchaka在 bpo-29192 )这个 mode 的参数
os.makedirs()
不再影响新创建的中间级目录的文件权限位。要设置它们的文件权限位,可以在调用之前设置umaskmakedirs()
. (Serhiy Storchaka在 bpo-19930 )这个
struct.Struct.format
现在是类型str
而不是bytes
. (由Victor Stinner在 bpo-21071 )parse_multipart()
现在接受 encoding 和 errors 参数和返回的结果与FieldStorage
:对于非文件字段,与键关联的值是字符串列表,而不是字节。(由Pierre Quentel在 bpo-29979 )由于内部变化
socket
呼唤socket.fromshare()
在由创建的套接字上socket.share
在旧的python版本中不支持。repr
对于BaseException
已更改为不包含尾随逗号。大多数例外情况都受此更改的影响。(Serhiy Storchaka在 bpo-30399 )repr
对于datetime.timedelta
已更改为在输出中包含关键字参数。(由乌特卡什·乌帕迪耶在 bpo-30302 )因为
shutil.rmtree()
现在使用os.scandir()
函数,用户指定的处理程序 出错 现在用第一个参数调用os.scandir
而不是os.listdir
当列出目录时失败。在正则表达式中支持嵌套集和集操作,如 Unicode Technical Standard #18 将来可能会添加。这将改变语法。为了促进未来的变革
FutureWarning
暂时将在不明确的情况下提出。包括以文字开头的集合'['
或包含文字字符序列'--'
,'&&'
,'~~'
和'||'
.为避免出现警告,请用反斜杠将其转义。(Serhiy Storchaka在 bpo-30349 )将字符串拆分到
regular expression
与空字符串匹配的内容已更改。例如,拆分r'\s*'
现在将不仅在空白处拆分,而且在所有非空白字符之前和字符串末尾之前的空字符串上拆分。通过将模式更改为r'\s+'
. 一FutureWarning
从python 3.5开始就为这种模式发出。对于同时匹配空字符串和非空字符串的模式,在其他情况下搜索所有匹配的结果也可能发生更改。例如在字符串中
'a\n\n'
,模式r'(?m)^\s*?$'
不仅匹配位置2和3处的空字符串,还匹配字符串'\n'
位置2-3。要只匹配空白行,模式应重写为r'(?m)^[^\S\n]*$'
.re.sub()
现在替换与前一个非空匹配相邻的空匹配项。例如re.sub('x*', '-', 'abxd')
立即返回'-a-b--d-'
而不是'-a-b-d-'
(在“b”和“d”之间的第一个减号替换“x”,第二个减号替换在“x”和“d”之间的空字符串)。变化
re.escape()
只转义regex特殊字符,而不是转义除ASCII字母、数字和'_'
. (Serhiy Storchaka在 bpo-29995 )tracemalloc.Traceback
帧现在从最旧到最新排序,以便与traceback
. (由Jesse Bakker在 bpo-32121 )在支持的操作系统上
socket.SOCK_NONBLOCK
或socket.SOCK_CLOEXEC
位标志socket.type
不再应用它们。因此,检查如下if sock.type == socket.SOCK_STREAM
在所有平台上按预期工作。(由Yury Selivanov在 bpo-32331 )在Windows上 close_fds 的参数
subprocess.Popen
已从更改False
到True
重定向标准句柄时。如果以前在使用时依赖于继承的句柄subprocess.Popen
使用标准IO重定向,您必须通过close_fds=False
保留以前的行为,或使用STARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
--它隐含地影响importlib.invalidate_caches()
--现在删除sys.path_importer_cache
设置为None
.(布雷特·坎农在 bpo-33169 )在
asyncio
,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop.getaddrinfo()
,loop.getnameinfo()
已更改为与文档匹配的适当协程方法。以前,这些方法返回asyncio.Future
实例。(由Yury Selivanov在 bpo-32327 )asyncio.Server.sockets
现在返回服务器套接字的内部列表的副本,而不是直接返回。(由Yury Selivanov在 bpo-32662 )Struct.format
现在是str
实例而不是bytes
实例。(由Victor Stinner在 bpo-21071 )argparse
现在可以通过required=True
到ArgumentParser.add_subparsers()
. (安东尼·索蒂尔供稿 bpo-26510 )ast.literal_eval()
现在更严格了。不再允许任意数字的加和减。(Serhiy Storchaka在 bpo-31778 )Calendar.itermonthdates
当某个日期超出0001-01-01
通过9999-12-31
范围。为了支持不能容忍此类异常的应用程序,新的Calendar.itermonthdays3
和Calendar.itermonthdays4
可以使用。新方法返回元组,并且不受支持的范围的限制。datetime.date
. (亚历山大·伯罗波尔斯基于年 bpo-28292 )collections.ChainMap
现在保留底层映射的顺序。(由Raymond Hettinger在 bpo-32792 )这个
submit()
方法concurrent.futures.ThreadPoolExecutor
和concurrent.futures.ProcessPoolExecutor
现在提出一个RuntimeError
如果在解释器关闭期间调用。(由Mark Nemec在 bpo-33097 )这个
configparser.ConfigParser
构造函数现在使用read_dict()
处理默认值,使其行为与解析器的其余部分一致。默认字典中的非字符串键和值现在被隐式转换为字符串。(詹姆斯·托克内尔在 bpo-23835 )一些无文件证明的内部输入被取消。一个例子是
os.errno
不再可用;使用import errno
直接代替。请注意,即使是在微版本发布中,此类未经记录的内部导入也可以随时删除,恕不另行通知。
C API中的更改¶
函数 PySlice_GetIndicesEx()
对于可调整大小的序列被认为不安全。如果切片索引不是 int
,但实现 __index__()
方法,将序列的长度传递给 !PySlice_GetIndicesEx . 这可能会导致返回序列长度之外的索引。为了避免可能出现的问题,请使用新函数 PySlice_Unpack()
和 PySlice_AdjustIndices()
. (Serhiy Storchaka在 bpo-27867 )
cpython字节码更改¶
有两个新的操作码: LOAD_METHOD
和 CALL_METHOD
. (由Yury Selivanov和Inada Naoki在 bpo-26110 )
这个 STORE_ANNOTATION
操作码已被删除。(由Mark Shannon在 bpo-32550 )
仅限Windows的更改¶
用于重写的文件 sys.path
现在叫做 <python-executable>._pth
而不是 'sys.path'
. 见 查找模块 更多信息。(史蒂夫·道尔在 bpo-28137 )
其他CPython实施变更¶
为将来对公共CPython运行时初始化API的潜在更改做准备(请参见 PEP 432 对于一个初始的,但有点过时的草案),CPython的内部启动和配置管理逻辑已经被显著地重构了。虽然这些更新对嵌入的应用程序和常规cpython cli的用户都是完全透明的,但是这里提到的它们是由于重构在解释器启动期间更改了各种操作的内部顺序,因此可能会发现嵌入应用程序或cpytho中以前潜在的缺陷。n本身。(最初由Nick Coghlan和Eric Snow作为 bpo-22257 以及尼克、埃里克和维克多·斯廷纳在其他一些问题上的进一步更新)。一些已知细节受到影响:
PySys_AddWarnOptionUnicode()
由于在调用前需要创建Unicode对象,因此嵌入应用程序当前不可用。 Py_Initialize . 使用PySys_AddWarnOption()
相反。嵌入应用程序添加的警告筛选器
PySys_AddWarnOption()
现在应该更一致地优先于解释器设置的默认过滤器
由于配置默认警告筛选器的方式发生了更改,设置 Py_BytesWarningFlag
大于1的值不再足以同时发射 BytesWarning
并将其转换为异常。相反,必须设置标志(首先导致发出警告),并显式 error::BytesWarning
添加了警告筛选器以将其转换为异常。
由于编译器处理docstring的方式发生了变化,因此 return None
在仅由docstring组成的函数体中,现在标记为与docstring在同一行上发生,而不是在函数的标题行上发生。
当前异常状态已从帧对象移动到协同例程。这简化了解释器,并修复了在进入或退出生成器时由交换异常状态引起的一些不明显的错误。(由Mark Shannon在 bpo-25612 )
python 3.7.1的显著变化¶
从3.7.1开始, Py_Initialize()
现在,始终阅读并尊重与 Py_Main()
(在早期的Python版本中,它尊重那些环境变量的一个定义不正确的子集,而在Python3.7.0中,由于 bpo-34247 )如果不需要此行为,请设置 Py_IgnoreEnvironmentFlag
调用前为1 Py_Initialize()
.
在3.7.1中,上下文变量的C API was updated 使用 PyObject
指针。也见 bpo-34762 .
在3.7.1中 tokenize
模块现在隐式地发出 NEWLINE
当输入没有尾随新行时提供标记。这种行为现在与C记号赋予器在内部所做的相匹配。(安马尔·阿斯卡尔在 bpo-33899 )
python 3.7.2的显著变化¶
在3.7.2, venv
在Windows上,不再复制原始二进制文件,而是创建名为 python.exe
和 pythonw.exe
相反。这解决了一个长期存在的问题,即所有虚拟环境都必须使用每个Python更新进行升级或重新创建。但是,请注意,这个版本仍然需要重新创建虚拟环境才能获得新的脚本。
Python 3.7.6中的显著变化¶
由于重大安全问题 reuse_address 参数 asyncio.loop.create_datagram_endpoint()
不再支持。这是因为socket选项的行为 SO_REUSEADDR
在UDP中。有关详细信息,请参阅 loop.create_datagram_endpoint()
. (作者:凯尔·斯坦利、安托万·皮特罗和尤里·塞利万诺夫 bpo-37228 )