Python 3.7 中的 PEP 562

按照Python3.7的发布时间表,明天Python 3.7.0就发布了,最近各大开源项目都在做3.7相关的调整,之后我还会写文章更详细的介绍Python 3.7都带来了什么,敬请关注!Python 3.7是一个比较中庸的版本,我比较关注的是PEP 557 和 本文要提到的 PEP 562。

PEP557是Data Classes,之前我已经在

attrs 和 Python3.7 的 dataclasses

里面专门介绍了。

PEP 562主要做的是什么呢?

Customization of Access to Module Attributes

就是能在模块下定义__getattr__和__dir__方法,实现定制访问模块属性了。有什么用呢?其实官网已经给出了答案:

弃用某些属性/函数

懒加载(lazy loading)

__getattr__让模块属性的访问非常灵活,我分别举几个例子:

弃用某些属性/函数时

有时候会修改一些函数或者属性,会写新的版本,旧版本的在一段时间之后会弃用。在大型项目中调用者有很多,不了解业务挨处修改成本很高,通常会在旧版本的函数中加入DeprecationWarning,有3个问题:

使用新的属性是没法提示DeprecationWarning,只能在模块级别加warn

如果找不到属性/函数直接抛错误了,不能做特殊处理

模块下弃用的函数多了,只能在每个函数内部加入warn,再执行新函数逻辑

而Python 3.7就没这个问题了:

看一下效果吧:

懒加载

懒加载是指从一个数据对象通过方法获得里面的一个属性对象时,这个对应对象实际并没有随其父数据对象创建时一起保存在运行空间中,而是在其读取方法第一次被调用时才从其他数据源中加载到运行空间中,这样可以避免过早地导入过大的数据对象但并没有使用的空间占用浪费。

简单地说,按需才加载。这是一种设计模式。

Python3.7之前想要import模块成功,就得在模块里面把相关属性/函数/类等都准备好,其实import模块时候是很重的,现在可以通过PEP 562,能够极大的提升import的效率,尤其是导入了很重的逻辑。就如PEP中提的例子:

可以看到, 的时候,HeavyClass还没有没有加载的,当第一次使用lib.submodule的时候才会加载。

在标准库里面也有应用,比如 bpo-32596 中对 concurrent.futures 模块的修改:

这样还可以让 时可以快15%。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180627G1WHIG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券