南京音乐推荐联合社

Python3.6新特性官方文档中文版

架构文摘 2019-06-11 08:43:52

Github地址:https://github.com/PyCN/PTR(因篇幅限制,摘选精要)


摘要 - 发布亮点


新的语法特性:


  • PEP 498, 格式化字符串字面量

  • PEP 515, 数字字面量中的下划线

  • PEP 526, 变量注解中的语法

  • PEP 525, 异步生成器

  • PEP 520: 异步解析式


新的库模块


  • secrets: PEP 506 - 在标准库中添加了Secrets模块


CPython实现的改进:


  • 重新实现了字典(dict)类型,以便能像PyPy的字典类型一样使用更紧凑的表达方式。与Python 3.5相比,这使字典的内存用量减少了20%到25%。

  • 用新协定优化了类的自定义建立。

  • 类属性定义顺序(class attribute definition order)现在被保留了。

  • **kwargs内的元素顺序现在对应于将关键字(保留字)参数传递给函数的顺序。

  • 新增了对DTrace和SystemTap probing的支持。

  • 新PYTHONMALLOC环境变量现在可用于调试解释器内存分配与访问错误。


标准库的重大改进:


  • 为asyncio模块开发了新功能、显著的可用性、性能优化,以及大量的错误修复。 从Python 3.6开始,asyncio模块不再是临时的了,其API也进入了稳定状态。

  • 实现了用于支持类路径对象(path-like objects)的新文件系统路径协议。 所有在路径(path)上使用的标准库函数都已更新,以便适应于新协议。

  • datetime模块已获得对本地时间消歧(Local Time Disambiguation)的支持。

  • 针对typing模块的一些改进,使其不再是临时模块。

  • tracemalloc模块已重大改进,现用于为ResourceWarning提供更好的输出,并为内存分配错误提供更好的诊断。 欲知详情,请参阅PYTHONMALLOC部分。


安全相关的改进:


  • 新secrets模块被用于简化那些适用于管理密文的密码学安全伪随机数生成器(cryptographically strong pseudo-random numbers)的生成过程,如认证、token等。

  • 在Linux上,现将os.urandom()改成了阻塞模式,直到系统的urandom的熵池(entropy pool)的初始化具有更高的安全性。 解释请参见PEP 524。

  • hashlib和ssl模块现已支持OpenSSL 1.1.0。

  • 改进了ssl模块的默认设置和特性集。

  • 新增了hashlib模块对BLAKE2、SHA-3、SHAKE哈希算法以及scrypt()密钥导出函数的支持。


Windows上的改进:


  • PEP 528与PEP 529,Windows文件系统和控制台的编码已更改为UTF-8。

  • 当用户没有指定版本(通过命令行参数或配置文件)时,py.exe启动器以交互方式使用时,不再以Python 2优先于Python 3。 处理shebang行的方式保持不变 - 此处的“python”依旧指Python 2。

  • python.exe和pythonw.exe已标记为长路径敏感(long-path aware),这意味着260字符路径限制可能不再适用。 有关详细信息,请参阅删除MAX_PATH限制。

  • 可以添加._pth文件以强制隔离模式(isolated mode)并完全指定所有搜索路径,以避免注册表查找和环境查找。 有关详细信息,请参阅文档。

  • 一个python36.zip文件现可用作一个地标(landmark)以臆指PYTHONHOME。 有关详细信息,请参阅文档。


新特性


PEP 498: 格式化字符串


PEP 498引入了一种新的字符串:_f-strings_, 或者格式化字符串。


格式化字符串带'f'前缀,类似于str.format()接受的格式字符串。它们包含了由花括号括起来的替换字段。替换字段是表达式,它们会在运行时计算,然后使用format()协议进行格式化:


>>> name = "Fred"    >>> f"He said his name is {name}."    'He said his name is Fred.'    >>> width = 10    >>> precision = 4    >>> value = decimal.Decimal("12.34567")    >>> f"result: {value:{width}.{precision}}"  # nested fields    'result:      12.35'


特性文档 https://link.zhihu.com/?target=https%3A//docs.python.org/3.6/reference/lexical_analysis.html%23f-strings。


PEP 526: 变量注解语法


PEP 484引入了函数参数的类型注释的标准,又名类型提示。这个PEP添加了用来注释变量(包括类变量和实例变量)类型的语法:


primes: List[int] = []    captain: str  # Note: no initial value!    class Starship:        stats: Dict[str, int] = {}


正如函数注释,Python解释器不附加任何特殊意义到变量注解上,只是将它们存储在一个类或者模块的__annotations__属性中。


与静态类型语言中的变量声明相比,注释语法的目的在于提供一种简单的方式,通过抽象语法树和__annotations__属性,来为第三方工具和库指定结构化类型元数据。


PEP 515: 数值文字中的下划线


PEP 515添加了在数值文字中使用下划线的能力,以提高可读性。数字之间和任何基本符号之后允许单个下划线。不允许前置、后置或者多个连续的下划线。


字符串格式化语言现在还支持'_'选项,该选项用来通知对浮点表示类型和整型表示类型'd',会把下划线当成千位分隔符使用。对于整型表示类型'b', 'o', 'x', 和'X', 下划线将会被插入到每4个数字之间:


>>> '{:_}'.format(1000000)    '1_000_000'    >>> '{:_x}'.format(0xFFFFFFFF)    'ffff_ffff'


又见


PEP 515 - 数值文字中的下划线


PEP 525: 异步生成器


PEP 492 引入支持原生协程和async /await的语法到Python 3.5。 在Python 3.5实现里的一个值得注意的 

局限性就在于它不可能使用await和`yield'在同一个函数体中。 而在Python 3.6中,这个限制 

已解除,这使得定义异步生成器成为可能:


async def ticker(delay, to):        """Yield numbers from 0 to *to* every *delay* seconds."""        for i in range(to):            yield i            await asyncio.sleep(delay)


新的语法允许更快更简洁的代码。


参见 

PEP 525 - 异步生成器


PEP 530: 异步解析式


PEP 530 添加了对async for在list、set、dict解析式以及generator表达式中的使用支持:


    result = [i async for i in aiter() if i % 2]


此外,所有解析式都支持“await”表达式:


    result = [await fun() for fun in funcs if await condition()]


参见 

PEP 530 - 异步解析式


PEP 487: 用于建立类的更简单的自定义


现在可以在不使用元类的情况下自定义子类。每当创建一个新的子类时,新的__init_subclass__类方法将在基类上被调用,:


class PluginBase:        subclasses = []        def __init_subclass__(cls, **kwargs):            super().__init_subclass__(**kwargs)            cls.subclasses.append(cls)    class Plugin1(PluginBase):        pass    class Plugin2(PluginBase):        pass


为了允许零参数super()从_init_subclass __()实现中被正确的调用并工作,自定义元类必须确保新的__classcell__命名空间输入传递到type .__ new__(如创建类对象)


参见


PEP 487 - 用于建立类的更简单的自定义


功能文档 https://link.zhihu.com/?target=https%3A//docs.python.org/3.6/reference/datamodel.html%23class-customization


PEP 487: 描述符协议增强


PEP 487 扩展描述符协议必须包括新的可选的__set_name __()方法。 每当定义一个新类时,新方法将会调用定义中所有的描述符,并给它们提供定义类的引用,以及类命名空间中给予描述符的名字。 换句话说,描述符的实例现在可以获知所有者类的属性名


PEP 519: 添加文件系统路径协议


文件系统路径过去被表示为str或bytes对象。这会导致那些编写操作文件系统路径代码的人,假定这些对象只能是这两种类型之一(一个代表着文件描述符的int对象将不被计入即它不是一个文件路径)。 


不幸的是,这种假设局限了文件系统路径表示代方法,如已经存在的pathlib,同时也包括python的一些标准库。 


为了解决这种情况,定义了一个由os.PathLike表示的新接口。通过实现__fspath__()方法,一个对象表示一个路径,然后,可以将文件系统路径表示为一个较低等级的str或者bytes对象。这意味着,如果一个对象实现os.PathLike或者是str或bytes,该对象被认为是path-like,它代表一个文件系统路径。你可以使用os.fspath(),os.fsdecode()或os.fsencode()显式获取str以及/或bytes来表示一个path-like对象。 


内建函数open()已经更新,可以接受os.PathLike对象,以及在os和os.path模块中的所有函数,以及标准库中的大多数其他函数和类。类os.DirEntry以及pathlib中相关的类也已经可以实现os.PathLike。 


希望对操作文件系统路径基本功能的更新能够让第三方代码在不改变任何代码,或者至少是非常少的代码(例如,在操作path-like对象之前,在代码的开头调用os.fspath())的情况下,能够隐含地支持所有path-like objects对象。 


PEP 495: 本地时间消歧


世界上大多数地方,都曾经出现也将出现多次的时间回调。在这种时候,引入时间间隔用以表示本地时钟在同一天中出现两次相同的时间的情况,在这些情况下,本地时钟显示的时间(或存在在python datetime中的实例)不足及时表示特定的时刻。 


为了区分本地时间相同的两个时刻,PEP 495 在类datetime.datetime 和 `datetime.time` 的实例中增加了新的fold属性,属性 fold 的值除了表示不明确情况下的第二(时间顺序)时刻之外,其他所有实例的值都为 0。


PEP 529: 更改windows下文件系统编码格式为UTF-8


使用str (Unicode) 表示文件系统路径比bytes能获得更好的效果。尽管如此,在某些情况下bytes也足以胜任并且也是正确的。


在3.6之前,使用bytes路径可能导致数据丢失。改进后, windows下现在支持使用bytes表示路径,这些bytes将以sys.getfilesy stemencoding()的方式编码,默认编码格式为'utf-8'。


不使用str方式表示路径的应用程序应当使用os.fsencode()和os.fsdecode() 以确保他们的bytes被正确编码。要回复到之前的状态, 设置 PYTHONLEGACYWINDOWSFSENCODING 或者调用sys._enablelegacywindowsfsencoding()。


查看 PEP 529以获取更多信息并讨论可能需要变更的代码。


PEP 528: 更改windows控制台编码为UTF-8


windows下的默认控制台现在支持所有的Unicode字符并可以正确读取Python代码中的str对象。 sys.stdin, sys.stdout 

以及 sys.stderr 现在的默认使用utf-8编码。


这一变化仅适用于使用交互控制台之时,而非重定向文件或者管道。如果要使用之前的交互控制台, 需设置PYTHONLEGACYWINDOWSIOENCODING。


另请参阅


PEP 528 - 修改windows控制台编码为UTF-8


PEP 520: 保存类属性定义顺序


类的定义体中的属性有一个自然顺序:即源码中属性名出现的顺序。 这个顺序现在保存在新的类__dict__ 的属性中.


同样, 有效的缺省类和执行空间 (从type.prepare()返回)是一个保存插入顺序的映射。


另请参阅


PEP 520 - 保存类属性定义顺序


PEP 468: 保存关键字参数顺序


函数声明中的**kwargs 的顺序现在被保证是插入顺序的映射。


另请参阅


PEP 468 - 保存关键字参数顺序


新的 字典dict类型的实现


字典dict类型现在使用 PyPy首创的 "紧凑" 表达方式。 新字典dict() 的内存占用比Python3.5中减少20%到25%。


新的实现中保存顺序的功能被认为是不可过于依赖的(未来也许会改变,不过在将所有当前和未来的Python实现的语言规范转换为保证顺序的语法之前的几个版本中,新的dict有望被实现的; 这也能帮助保证对那些仍旧是随机迭代顺序的旧版本的向后兼容,比如Python 3.5)。


PEP 523:添加一个frame解析API到CPython


虽然Python提供了自定义代码执行方式的广泛支持,但是还有一个它没这样做的地方是frame对象的解析。如果你想要通过某些方式在Python中拦截frame解析,那么除了直接对定义的函数操作函数指针之外,真的没有什么其他方式。


PEP 523改变了这个处境,它提供了一个API,让frame解析在C层次上可插拔。这将允许诸如调试器或者JIT这样的工具在Python代码开始执行之前拦截frame解析。这使得python代码的可替换解析实现、跟踪frame解析等地使用成为可能。


这个API并不是受限的C API的一部分,并且被标为私有,表示期望限制这个API的使用,并且只能应用在非常选定的低层次用例上。这个API的语义将在必要的时候随着Python改动。


PYTHONMALLOC环境变量


新的PYTHONMALLOC环境变量允许设置Python内存分配器和安装调试钩子。


现在有可能在发布模式下使用PYTHONMALLOC=debug编译的Python中,在Python内存分配器上安装调试钩子。调试钩子的效果:


  • 新分配内存由字节0xCB填充

  • 被释放内存由字节0xDB填充

  • 检测Python内存分配器API的违规。例如,在由PyMem_Malloc()分配的内存块上调用PyObject_Free()。

  • 检测缓存开始位置之前的写入 (缓存下溢)

  • 检测缓存结束位置之后的写入 (缓存上溢)

  • 当调用了PYMEM_DOMAIN_OBJ (例如,PyObject_Malloc())和PYMEM_DOMAIN_MEM (例如,PyMem_Malloc())域的分配器函数时,检测持有GIL。


检测是否持有GIL也是Python 3.6的一个新特性。


见PyMem_SetupDebugHooks()函数,了解更多关于Python内存分配器上的调试钩子信息。


现在也有可能使用PYTHONMALLOC=malloc,从而强制所有Python内存分配使用C库的malloc()分配器。这在以发布模式编译的Python上,使用诸如Valgrind这样的外部内存调试器是有帮助的。


对于错误,Python内存分配器上的调试钩子现在使用tracemalloc模块来获取分配内存块的地址的回溯信息。


DTrace和SystemTap探测支持


Python现在可以使用--with-dtrace来构建,它为解释器中的以下事件启用了静态标志器:


  • 函数调用/返回

  • 垃圾回收开始/结束

  • 执行代码行。


这可以被用来检测生产中运行的解释器,而无需重新编译指定调试构建,或者提供应用特有的配置/调试代码。


详情请见用DTrace和SystemTap检测CPython。


在Linux和macOS上测试了当前实现。未来可能会添加额外的标志器。


其他语言方面的变化


我们还对 Python 语言的核心做了一些小的改变:


  • 现在在同一作用域内的 global 或 nonlocal 语句必须在受其影响的命名使用前显式出现。在先前版本中会发出语法警告。

  • 现在能以将 魔术方法 设置为 None 的方式来表示相应的操作不可用。 例如,如果将一个类的 __iter__() 设置为None,则该类不可迭代。

  • 在 traceback 中大量重复出现的 traceback lines 将会被略写成 "[前一行已经重复出现 {count} 次了]" (以 traceback 为例。).

  • 现在模块导入在找不到模块时引发新的异常ModuleNotFoundError(ImportError 的子类)。 当前检测 ImportError 的代码(try-except中)仍然可以工作。

  • 在类创建时,被元类调用的依赖无参数的 super() 的类方法时会正确工作。


新增模块


secrets


新增模块 secrets 的主要目的是:提供一个显式可靠的方式来产生适合于管理诸如账户认证,令牌之类的保密信息的加密的强伪随机值。


警告


注意在 random模块中的随机数生成器 不该 用于安全目的。Python 3.6 及以上版本请使用 secrets 而 Python 3.5 及更早的版本请使用 os.urandom()。


又见


PEP 506 - 向标准库添加 Secrets 模块


改进模块


array


耗尽的迭代器array.array现在将会保持被耗尽,即使被迭代的数组被拓展了。这与其他可变序列的行为保持了一致性。


ast


添加了新的ast.Constant的AST节点。它可以被外部的AST优化器出于永久聚合(constant foldind)。


asyncio


始于Python 3.6,asyncio模块将不再是临时的了,并且它的API被认为是稳定的。


从Python 3.5开始,在asyncio模块中值得注意的变化(由于临时的状态,所有的修改都应用到了3.5.x):


  • get_event_loop()函数已经被改变为,当从协同程序中调用和被回调调用时,总是返回当前正在运行的循环。

  • ensure_future()函数和所有使用其的函数,比如loop.run_until_complete(),现在接收所有种类的awaitable objects。

  • 新的run_coroutine_threadsafe()函数去从其他线程中提交协同程序到事件循环中。

  • 新的Transport.is_closing()方法去检查是否传输是关闭的或被关闭了

  • loop.creat_server()现在可以以列表接收主机了。

  • 新的loop.creat_future()方法去创建一个Future对象。这允许了替代事件循环的实现,比如uvloop,去提供了一种更快的asyncio.Future的实现。

  • 新的loop.get_exception_handler()方法去得到一个当时的异常的句柄。

  • 新的StreamReader.readuntil()方法从流中读取数据读取数据直到出现分隔符字符序列。

  • StreamReader.readexactly()的表现被提升了。

  • loop.getaddrinfo()方法被优化了,避免了如果地址问题已经解决,去调用系统函数getaddrinfo。

  • loop.stop()方法已经被更改,以便在当前迭代后立即停止循环。任何新的,作为最后一次迭代的结果的预定的回调将会被丢弃。

  • Future.set_exception在通过了一个StopIteration实例的异常后,将会引发TypeError。

  • 新的loop.connect_accepted_socket()方法被服务器用来接收asyncio外部的连接,但是使用asyncio去处理。

  • TCP_NODELAY标志位现在被默认设置为TCP传输。

  • 新的loop.shutdown_asyncgens()在关闭循环之前恰当的关闭挂起的异步生成器。

  • Future和Task类现在有一个已优化的C语言的实现,使得asyncio编码速度提高了30%。


binascii


b2a_base64()功能现在接收现在接收一个可选newline的关键词参数去控制是否新的一行的字符被加到返回值中。


cmath


新增了方法 cmath.tau 来表示(τ) 常量. (详情请查看 **PEP628** .)


新增的常量还有: 

cmath.inf 和cmath.nan 来对应math.inf 和math.nan, 另外还有cmath.infj 和cmath.nanj来匹配复数表达式的格式化.


collections


  • 新的Collection抽象基类已经增加到可表示大小的迭代器类里面 

  • 新的Reversible 有迭代器类的抽象基类 __reversed__() 方法. 

  • 新的 AsyncGenerator,是一种异步生成器类的抽象基类. 

  • 这个namedtuple()函数现在接受一个可选的关键字参数 module,它指定用于__module__返回的命名元组类的属性. 

  • namedtuple()的verbose 和 rename参数是强制关键字参数. 

  • 递归方法collections.deque 实例现在可使用pickle持久化存储. 


concurrent.futures


ThreadPoolExecutor 类的构造函数现在接受一个可选的thread_name_prefix 参数,使自定义线程池中的线程名字成为可能


contextlib


contextlib.AbstractContextManager 类已经成为上下文管理器中的一个抽象基类 

。它提供了一个合理的默认返回self的 enter()方法,和一个exit()抽象方法. 一个匹配的类`typing.ContextManager`.被添加到typing。 


faulthandler


在Windows平台,faulthandler模块安装了一个指示Windows异常的句柄 : 详情可见于 [faulthandler.enable()](https://docs.python.org/3.6/library/faulthandler.html#faulthandler.enable"faulthandler.enable" ).


fileinput


hook_encoded() 模块现在可支持errors参数. 


hashlib


hashlib 支持 OpenSSL 1.1.0。推荐使用的最低版本为1.0.2.


BLAKE2 hash 函数也被收录进这一模块. 

blake2b() 与blake2s() 将长期支持BLAKE2的所有特性.


新增SHA-3哈希函数sha3_224(),sha3_256(),sha3_384(),sha3_512(), 与SHAKE 哈希函数 shake_128() 、shake_256() . 


基于密码的密钥导出函数scrypt() 可使用 OpenSSL 1.1.0 或更新版本.


http.client


HTTPConnection.request()andendheaders()将全部支持分块编码请求体.


idlelib and IDLE


对idle包做了现代化的改进与重构,使得IDLE更美观、更好用的同时令编程更易于理解、测试与改进。在IDLE的美化方面,特备针对Linux和Mac用户,我们在大多数对话框上应用了ttk插件。总之,IDLE将不再支持tcl/tk 8.4。现在要求有 tcl/tk 8.5 或 8.6。我们建议在使用时运行最新的版本.


“现代化”包括对idlelib模块的重命名和整合.重命名文件部分大写的名字是与之前版本类似的命名,例如,Tkinter和TkFont对应3.0版本中的Tkinter和tkinter.font 。因此,对idlelib在3.5环境下导入的文件通常不会工作在3.6。至少一个模块的名称需要改变(见idlelib / readme.txt),有时甚至会更多。


做点补充,最终的结果是,一些idlelib类会更容易使用,将具有更好的API文档与字符串的解释。其他有用的信息会在可用时被及时添加到idlelib。


importlib


当无法找到被导入模块时会跳出一个新的异常提示ModuleNotFoundError(ImportError的一个子类)。检测ImportError的代码(try-except)依然会工作。


importlib.util.LazyLoader在打包好的装载器上更名为`create_module()` , 去除了importlib.machinery.BuiltinImporter与`importlib.machinery.ExtensionFileLoader`

不能同 importlib.util.LazyLoader一起使用的限制.


importlib.util.cache_from_source(),importlib.util.source_from_cache(), 和importlib.util.spec_from_file_location() 现在可接受path-likeobject.


inspect


inspect.signature()函数现在支持报告由编译器为推导式和生成器表达式范围生成的隐式.0参数,就好像它们是名为implicit0的仅位置参数。


为了减少从Python2.7和旧版`inspect.getargspec()` API升级时的代码改动,先前记录的对`inspect.getfullargspec()`对弃用已经撤销。虽然这个函数对于单个/源Python2/3代码库是很方便的,但是更丰富的`inspect.signature()`接口仍然是新代码的推荐方法。


json


json.load()和json.loads()现在支持二进制输入。已编码的JSON应该用UTF-8, UTF-16, 或者UTF-32来表示。


logging


已添加新的WatchedFileHandler.reopenIfNeeded()方法来增加检查日志文件是否需要被重新打开的能力。


math


已添加tau (τ)常量到math和cmath模块中。


multiprocessing


multiprocessing.Manager()返回的Proxy对象现在可以被嵌套。


os


见PEP 519的摘要,以获取关于os和os.path模块现在如何支持类路径(path-like)对象的详情。


scandir()现在支持Windows上的bytes路径。


一个新的close()方法允许显式关闭一个scandir()迭代器。scandir()迭代器现在支持上下文管理器协议。如果一个scandir()迭代器既不是被耗尽,也不是被显式关闭,那么在其析构函数中将会抛出一个ResourceWarning。


在Linux上,os.urandom()现在会阻塞,直到系统的urandom entropy池被初始化,以提高安全性。见**PEP 524**以了解缘由。


Linux的getrandom()系统调用(获取随机字节)现在作为新的os.getrandom()函数公开。


pathlib


pathlib现在支持类路径(path-like)对象。 


pdb


Pdb类构造器有一个新的可选readrc参数,用来控制是否应该读取.pdbrc文件。


pickle


对象,现在可以使用关键参数 __new__进行持久存储pickle协议超过已有的协议版本4.支持这种情况.


pickletools


现在[pickletools.dis()](32.13. pickletools - Tools for pickle developers - Python 3.6.0 documentation

kletools.dis "pickletools.dis" )输出的隐含备注是MEMOIZE操作码的索引。


pydoc


pydoc模块已经学会遵守MANPAGER环境变量。


help()和 pydoc 现在能用指定的元组字段定义的顺序来显示列表,而不是按字母顺序。


random


这个新choices()函数返回一个指定元素大小的列表,通过可选权重给出它的规模。


re


在正则表达式中,增加对 spans 修饰符的支持。 示例: 

'(?i:p)ython' 匹配 'python' 和 'Python', 但不匹配'PYTHON';'(?i)g(?-i:v)r' 匹配 'GvR' 和 'gvr', 但不匹配'GVR'。


匹配对象组可通过 __getitem__访问, 它就等价于 group()。因此, 现在mo['name'] 就等价于 mo.group('name')。


现在,Match 对象支持 index-like objects 一样的组索引。 


readline


增加了 set_auto_history()启用或停用自动把输入加到历史列表中。


rlcompleter


现在,除非前缀开始使用下划线,否则私有和特殊属性名称就被忽略。在一些完成的关键字后面添加一个空格或冒号。 


shlex


shlex 已经大大 改进shell的兼容性 ,通过新的punctuation_chars 参数来控制,哪些字符被作为标点符号。


site


在一个.pth文件里,当指定路径添加到sys.path中,可能你现在要在目录之上指定文件路径 (例如:zip文件)。 


sqlite3


sqlite3.Cursor.lastrowid 现在支持REPLACE 声明.


socket


ioctl()函数现在支持`SIO_LOOPBACK_FAST_PATH` 控制代码.


getsockopt() 常量 SO_DOMAIN, 

SO_PROTOCOL, SO_PEERSEC, 和 SO_PASSSEC 现已被支持.


setsockopt()现在支持setsockopt(level, optname, None, optlen: int) 形式. 


socket 模块现在支持地址族AF_ALG 来和Linux Kernel crypto API连接. 添加了ALG_*,SOL_ALG 和 sendmsg_afalg().


socketserver


基于 

socketserver 模块,包括了http.server,xmlrpc.server和wsgiref.simple_server的Servers 现在支持 contextmanagerprotocol.


StreamRequestHandler 类的 wfile 属性 现在实现 the`io.BufferedIOBase` 可写接口. 特别地, 调用 write() 现在可以保证完全发送数据. 


ssl


ssl 已支持 OpenSSL 1.1.0. 最低推荐版本号是 1.0.2.


3DES 已从默认密码套件default cipher suites中删除添加了密码套件ChaCha20 Poly1305. 


SSLContext 有更好的默认配置选项和密码


SSL session 可以使用新的 SSLSession 类从一个客户端连接复制到另一个客户端连接.TLS会话恢复可以加速初始握手,减少延迟并提高性能


新的 get_ciphers()方法可以用来得到一个按密码优先级顺序的已启用密码列表.


所有的 constants and flags已转换为IntEnum 和 IntFlags.


Server 和 client-side添加SSLContext 特定 TLS 协议.


statistics


已添加一个新的harmonic_mean()函数。


struct


通过'e'格式限定符,struct现在支持IEEE 754半精度浮点。


subprocess


当子系统仍然运行着的时候,subprocess.Popen析构函数现在发出一个ResourceWarning警告。使用上下文管理器协议(with proc: ...)或者明确调用wait()方法来读取子进程的退出状态。 


subprocess.Popen构造函数和所有传给它的函数现在接受encoding和errors参数。指定其中一个将会为stdin, stdout和stderr流启用文本模式。


sys


新的getfilesystemencodeerrors()函数返回用来在Unicode文件名和字节文件名之间转换的错误模式的名字。


在Windows上,getwindowsversion()函数的返回值现在包含了platform_version字段,它包含当前操作系统准确的最大版本、最小版本和构建版本,而不是模拟进程的版本 


telnetlib


Telnet现在是一个上下文管理器了


time


struct_time的属性tm_gmtoff和tm_zone现在在所有平台上都可用了。


timeit


已添加新的Timer.autorange()便捷方法来反复调用Timer.timeit(),以便总运行时间大于或等于200毫秒


当在最佳和最差时间之间存在一个很大(4x)的差时,timeit现在会告警。


tkinter


在tkinter.Variable类中添加了方法trace_add(),trace_remove()和trace_info()。它们代替了之前版本中的trace_variable(),trace(),trace_vdelete()和trace_vinfo()方法,这些方法使用过时的Tcl命令,而在未来版本的Tcl中,这些Tcl命令可能不起作用。


traceback


traceback模块和解释器内置的异常展示现在都省略回溯中重复行的长串


tracemalloc


tracemalloc模块限制支持跟踪多个不同地址空间内的内存分配。


已添加新的DomainFilter过滤器类来根据地址空间(域)过滤块跟踪。


typing


从Python 3.6起,typing模块不再是临时的了,可以把它的API当成稳定版本使用。


由于typing模块在Python 3.5中是临时的,因此Python 3.6中引入的所有变动也已向后移植到Python 3.5.x。


typing模块很大提高了对范型别名的支持。例如,Dict[str,Tuple[S,T]]现在是一个有效的类型注释了。


已添加typing.ContextManager类来展示contextlib.AbstractContextManager。


已添加typing.Collection类来展示collections.abc.Collection。


已添加typing.ClassVar类型构造,来标识类变量。如**PEP 526**中所述,封装在ClassVar中的一个变量注解暗示着一个给定的属性打算作为一个类变量使用,并且不应该在那个类的实例上设置它。


一个新的TYPE_CHECKING常量被静态类型检查器假设为True,但在运行时则为False。 


已添加一个新的NewType()辅助函数来为注释创建轻量单值类型:


from typing import NewType    UserId = NewType('UserId', int)    some_id = UserId(524313)


静态类型检查器将会把新的类型当成原始类型的一个子类。


unicodedata


unicodedata模块现在使用来自Unicode 9.0.0的数据。 


unittest.mock


Mock类有以下改进:


两个新的方法,Mock.assert_called()和Mock.assert_called_once(),用来检测是否调用了mock对象。


Mock.reset_mock()方法现在拥有两个可选的仅关键字参数:return_value 和 side_effect。 


urllib.request


如果一个HTTP请求具有一个文件或者可迭代请求体 (不同于一个bytes对象),但是没有Content-Length头,那么现在AbstractHTTPHandler会回退到使用分块传输编码,而不是抛出一个错误。 


urllib.robotparser


RobotFileParser现在支持Crawl-delay和Request-rate扩展。


venv


venv接受一个新的参数--prompt。这个参数为虚拟环境提供一个可替换的前缀。


warnings


增加一个可选参数到warnings.warn_explicit()函数中:引发ResourceWarning的已销毁对象。 同时,属性也添加到warnings.WarningMessage 中。


当引发 ResourceWarning 警告时,tracemalloc 模块就尝试检索分配了销毁对象的跟踪。


“对象分配”跟踪是新的,并且只有当tracemalloc正在跟踪Python内存分配,并且 warnings 模块已经导入时才会显示。


winreg


新增64位整数类型REG_QWORD.


winsound


允许传递关键词参数到Beep,MessageBeep, 和PlaySound 方法。


xmlrpc.client


xmlrpc.client 模块现支持解压由apache XML-RPC实现用于数字和'None'的附加数据类型。


zipfile


一个新的类方法ZipInfo.from_file() 允许从文件系统文件中生成一个ZipInfo 实例。 

一个新的方法 ZipInfo.is_dir() 能够用来检查ZipInfo 实例是否表示一个目录。


ZipFile.open() 方法现在能够将数据写入到一个ZIP文件,也能够从中提取数据。 


zlib


compress() 以及decompress() 函数现接受关键词参数。


优化


  • Python解释器现在使用16位编码而不是字节码,这使得你可以实现多种操作码的优化。

  • asyncio.Future类现在有一种优化的C实现。

  • asyncio.Task类现在有一种优化的C实现

  • 在typing模块中通过各种改进的实施(如泛型类型的缓存),使得其允许高达30倍的性能优化,并且减少了内存占用。

  • ASCII解码器的错误处理程序 surrogateescape, ignore 以及replace 速度提高了60倍。

  • ASCII和Latin1解码器的错误处理程序 surrogateescape 速度提高了3倍

  • UTF-8解码器的错误处理程序 ignore, replace,surrogateescape, surrogatepass速度提高了75倍

  • UTF-8解码器的错误处理程序ignore, replace andsurrogateescape速度提高了15倍。

  • bytes % args现在速度可以提高到2倍。

  • bytearray % args 现在速度是以前的2.5到5倍。

  • 对bytes.fromhex()和bytearray.fromhex()进行优化:现在比以前快2x到3.5x倍。

  • 对bytes.replace(b'', b'.')和bytearray.replace(b'', b'.')进行优化:速度可提高80%。

  • 现在PyMem_Malloc()域(PYMEM_DOMAIN_MEM)的分配函数使用pymalloc memory allocator,而不是C库中的malloc()函数。 pymalloc分配器针对大小小于等于512字节、生命周期较短的对象进行了优化,而当需要占用较大内存块时则使用malloc()。 

  • 当对大量小对象进行反序列化时,pickle.load()和pickle.loads()的速度可提高10%。

  • 与传递位置参数相比,将关键字参数传递给函数会带来额外的开销。 现在在通过使用Argument Clinic实现的扩展功能中,这种开销将会显著的降低。

  • 对glob模块中的glob()及iglob()进行优化;使得它们现在大概快了3-6倍

  • 使用os.scandir()对pathlib中的glob进行优化;使它大概快了1.5-4倍

  • xml.etree.ElementTree中解析、迭代和深拷贝的性能有了显著的提高

  • 由浮点数和小数创建fractions.Fraction实例的速度提高了2到3倍


构建和C API变动


  • Python现在构建需要工具链中的一些C99支持。最值得注意的是,Python现在使用标准的整型类型和宏来替代诸如PY_LONG_LONG的自定义宏。

  • 带Android NDK和Android API level 21 (Android 5.0 Lollilop) 或者更高版本交叉编译CPython可以成功运行。虽然Android尚未是一个支持的平台,但是Python测试套件在Android模拟器上运行只有大约16个测试错误。见Android元问题issue 26865。

  • 已添加--enable-optimizations配置标志。打开它将会激活昂贵的优化,例如PGO。

  • 当PYMEM_DOMAIN_OBJ (例如:PyObject_Malloc())和PYMEM_DOMAIN_MEM (例如:PyMem_Malloc())域的分配函数被调用的时候,现在必须使用GIL。

  • 新的Py_FinalizeEx() API,它表示是否清除缓冲数据失败。 

  • PyArg_ParseTupleAndKeywords()现在支持仅位置参数。仅位置参数是由空名称定义的

  • PyTraceback_Print方法现在省略了重复行的长串,变成"[Previous line repeated {count} more times]"

  • 新的PyErr_SetImportErrorSubclass()函数指定要引发的ImportError的子类

  • 新的PyErr_ResourceWarning()函数可以被用来生成一个ResourceWarning,提供资源分配的来源

  • 新的PyOS_FSPath()函数返回一个类路径(path-like)对象的文件系统表示

  • PyUnicode_FSConverter()和PyUnicode_FSDecoder()函数现在会接受类路径(path-like)对象。


其他改进


当使用--version (短格式:-V)两次的时候,Python打印sys.version以获得详细信息。


新的关键词


在后续的Python 3.7 中,async 和 await 将作为关键字使用, 因此不再建议使用它们作为变量名,类名,函数名以及模块名称。 


已弃用的 Python 行为


  • Python 3.7 中, 在生成器中引发StopIteration异常,现在将会导致DesprecationWarning,并且触发`RuntimeError`. 查阅PEP 479: Change StopIteration handlinginside generators获得相关细节.


  • __aiter__()方法现在被期望返回异步迭代器, 

    而不是之前版本中的可等待迭代器,在 Python 3.6 中调用__aiter__()将会触发DeprecationWarning。 Python 3.7将会移除其的后向兼容性。(Contributed by Yury Selivanov inissue27243.)


  • 反斜杠对现在不能再作为有效的转义字符串使用,其会导致 

    DeprecationWarning.在接下来的几个Python版本,其最终会成为一个语法错误 

    SyntaxError。(Contributed by Emanuel Barry in issue 27364.)


  • 在执行相对引用, 且__spec__ 或 __package__未定义时,转而调用__name__ 和 __path__模块的行为, 现在将会引发ImportWarning异常. (Contributed by Rose Ames inissue25791.)


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。


-END-


架构文摘

ID:ArchDigest

互联网应用架构丨架构技术丨大型网站丨大数据丨机器学习

更多精彩文章,请点击下方:阅读原文

Copyright © 南京音乐推荐联合社@2017