python中的pep_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就没这个问题了:
# lib.py
import warnings
warnings.filterwarnings('default') # Python 3.2开始默认会隐藏DeprecationWarning
def new_function(arg, other):
print('plz use me!')
_deprecated_map = {
'old_function': new_function
}
def __getattr__(name):
if name in _deprecated_map:
switch_to = _deprecated_map[name]
warnings.warn(f'{name} is deprecated. Switch to {__name__}.{switch_to.__name__}.',
DeprecationWarning)
return switch_to
raise AttributeError(f"module {__name__} has no attribute {name}")
看一下效果吧:
>>> from lib import old_function
/Users/dongwm/test/lib.py:18: DeprecationWarning: old_function is deprecated. Switch to lib.new_function.
DeprecationWarning)
>>> old_function
>>> old_function(1, 2)
plz use me!
懒加载
懒加载是指从一个数据对象通过方法获得里面的一个属性对象时,这个对应对象实际并没有随其父数据对象创建时一起保存在运行空间中,而是在其读取方法第一次被调用时才从其他数据源中加载到运行空间中,这样可以避免过早地导入过大的数据对象但并没有使用的空间占用浪费。
简单地说,按需才加载。这是一种设计模式。
Python3.7之前想要import模块成功,就得在模块里面把相关属性/函数/类等都准备好,其实import模块时候是很重的,现在可以通过PEP 562,能够极大的提升import的效率,尤其是导入了很重的逻辑。就如PEP中提的例子:
# lib/__init__.py
import importlib
__all__ = ['submod', ...]
def __getattr__(name):
if name in __all__:
return importlib.import_module("." + name, __name__)
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
# lib/submod.py
print("Submodule loaded")
class HeavyClass:
...
# main.py
import lib
lib.submodule.HeavyClass # prints "Submodule loaded"
可以看到,import lib的时候,HeavyClass还没有没有加载的,当第一次使用lib.submodule的时候才会加载。
在标准库里面也有应用,比如 bpo-32596 中对 concurrent.futures 模块的修改:
def __dir__():
return __all__ + ('__author__', '__doc__')
def __getattr__(name):
global ProcessPoolExecutor, ThreadPoolExecutor
if name == 'ProcessPoolExecutor':
from .process import ProcessPoolExecutor as pe
ProcessPoolExecutor = pe
return pe
if name == 'ThreadPoolExecutor':
from .thread import ThreadPoolExecutor as te
ThreadPoolExecutor = te
return te
raise AttributeError(f"module {__name__} has no attribute {name}")
这样还可以让import asyncio时可以快15%。
标签: Python
顶一下
(0)
0%
踩一下
(0)
0%
python中的pep_Python 3.7 中的 PEP 562相关推荐
- python中的pep_Python的PEP文档是什么?
Python的PEP文档是一组不断发展的标准文档,PEP是Python Enhancement Proposal的首字母缩写.就像TCPIP协议使用RFC来组织起不断发展的通信标准一样,PEP也是类似 ...
- Python分析离散心率信号(中)
Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...
- 使用Python,OpenCV从静态背景中提取移动前景
使用Python,OpenCV从静态背景中提取移动前景 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍OpenCV中的背景减法方法--即从静态背景中提取移动前景.在许多基于视觉的应用中,背 ...
- python创建列向量_关于Numpy中的行向量和列向量详解
关于Numpy中的行向量和列向量详解 行向量 方式1 import numpy as np b=np.array([1,2,3]).reshape((1,-1)) print(b,b.shape) 结 ...
- python pandas库读取excel/csv中指定行或列数据详解
通过阅读表格,可以发现Pandas中提供了非常丰富的数据读写方法,下面这篇文章主要给大家介绍了关于python利用pandas库读取excel/csv中指定行或列数据的相关资料,需要的朋友可以参考下 ...
- python如何使用ppip安装xlwt_Python中xlrd和xlwt模块使用方法
原博文 2017-07-05 21:30 − 本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xl ...
- python selenium 下拉列表_从下拉列表中选择python selenium选项
我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项.在from selenium import webdriver from selenium.webdriver ...
- Python matplotlib可视化:在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)、水平条形图(horizontal bar)
Python matplotlib可视化:在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等).水平条形图(horizontal bar) 目录
- Python判断两个文件夹中互相不同的文件有哪些、判断一个文件夹相对于另外一个文件夹缺少了哪些文件
Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些文件 目录 Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些 ...
- Python使用pandas设置数据列中float数据类型的有效小数位数、抑制科学计数法
Python使用pandas设置数据列中float数据类型的有效小数位数.抑制科学计数法 目录
最新文章
- 规模 300+ 的研发团队,怎样保持工程高质高效?
- 为了找到你,CTO 和你唠唠研发都做啥?
- java 获取打印机缺纸_JAVASE 语言概述和JAVA
- 消息称荣耀7月发布年度旗舰 或用上旗舰级芯片骁龙 888
- I.MX6 shutdown by software
- 苹果留给 iOS 开发者的时间不多了:30 天内必须更新旧版本
- Android 内存泄漏问题多多,怎么优化?
- 【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)
- presentModalViewController和dismissModalViewControllerAnimated的使用总结
- <C语言>数据文件自动生成的实现
- Arduino实验二十五 超声波传感器测距实验
- kettle使用httpClient获取ES索引数据
- 无法在未启用宏的工作薄
- Ruoyi 整合Flowable UI Modeler 6.7.2
- 公众号绑定开发者流程
- python提醒事件_利用python实现短信和电话提醒功能的例子
- python中wheel什么意思_某个wheel(.whl)包的依赖关系是什么?
- 超全MyBatis动态代理详解!(绝对干货)
- linux下usb充电问题,如何解决在Ubuntu上iPad不能充电的问题
- vue中加载腾讯地图(html形式)