python基础之上下文管理器
前言
关于计算器运行的上下文的概念,我的理解也不是很深;按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到CPU的任务队列中,等待调度系统分配时间片执行。下面谈谈python上下文管理器的使用。
系列文章
上下文管理器
- python中最常用的上下文管理器就是文件的打开和关闭了。
with open(filename,'r') as file:
file.read()
原理
- python上下文使用with触发,内部实现了__enter__和__exit__两个魔法方法。
class context(object):
def __init__(self):
print('aaaa')
def __enter__(self):
print('bbbb')
def __exit__(self, exc_type, exc_val, exc_tb):
print('cccc')
# exc_type:异常的类型;
# exc_val:异常的详细信息;
# exc_tb:异常发生的位置;
# 如果没有发生异常,以上三个值都是None
with context() as f:
'''主体逻辑'''
print('xxxx')
# 输出
aaaa
bbbb
xxxx
cccc
- 当使用with触发管理器的时候,先初始化执行__init__得到一个对象,然后执行__enter__方法,再执行主体程序的逻辑,最后执行__exit__方法。
注意
当程序主体逻辑执行完毕退出with语句块或者主体逻辑代码块出现异常,则会自动执行__exit__方法,并且会把对于的异常参数传递进来;如果没有异常,传递的是None。
如果主体逻辑代码发生了错误,但是__exit__函数返回True,则with语句主体逻辑代码块异常不会被抛出,终止程序;如果返回None或者False,异常会被主动raise,并终止程序。
总结上下文管理器的完整的原理
初始化获取一个上下文管理器对象;
加载上下文管理器的 exit() 方法备用;
调用上下文管理器的 enter() 方法;如果有 as f从句,则将 enter() 方法的返回值赋给f;
执行主体逻辑代码块;
调用上下文管理器的 exit() 方法;
python的上下文管理工具contextlib
python内置了对于上下文管理器更优雅的管理方法
import contextlib
@contextlib.contextmanager
def test():
print('aaaaaa')
try:
yield 1
finally:
print('bbbbb')
with test() as f:
print('ccccc')
# 输出
aaaaaa
ccccc
bbbbb
底层简化版的原理
class ContextTest(object):
def __init__(self):
self.f = self.test()
def __enter__(self):
return next(self.f)
def __exit__(self, exc_type, exc_val, exc_tb):
try:
next(self.f)
except StopIteration:
return False
def test(self):
print('aaaaaa')
try:
yield 1
finally:
print('bbbbb')
with ContextTest() as f:
print(f)
print('kkkkkk')
- 说明:
先初始化一个ContextTest上下文管理器对象,得到一个对象的生成器test()
加载上下文管理器的 exit() 方法备用;
调用上下文管理器的 enter() 方法;执行next()方法唤醒test()生成器,执行yield关键字前面的代码;
执行主体逻辑代码;
调用上下文管理器的 exit() 方法;该方法调用next()方法再次唤醒生成器,执行yield关键字后面的代码;
参考
python基础之上下文管理器的更多相关文章
- Python之上下文管理器
# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之上下文管理器 #http://python.jobbole.com/82620/ #语法形式: ...
- (转)Python中的上下文管理器和Tornado对其的巧妙应用
原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...
- with和上下文管理器
with和上下文管理器 如果你有时间阅读源码的习惯,可能会看到一些优秀的代码会出现带有with关键字的语句. 对于系统资源如文件,数据库连接,socket而言,应用程序打开这些资源并执行完业务逻辑之后 ...
- Python with语句和上下文管理器
open("FishC.txt","w")#此处需注意如果被打开的文件中,已有内容,那么用w的方式打开,则会导致原文件内容被截断,也就是相当于被清空了,然后重新 ...
- python基础5之装饰器
内容概要: 一.装饰器前期知识储备 1.python解释函数代码过程: python解释器从上往下顺序解释代码,碰到函数的定义代码块不会立即执行它,而是将其放在内存中,等到该函数被调用时,才执行其内部 ...
- 深入理解 Python 中的上下文管理器
提示:前面的内容较为基础,重点知识在后半段. with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管 ...
- Python深入02 上下文管理器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...
- Python中的上下文管理器和with语句
Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围.本文是针对于该功能的思考总结. 为什么需要上下文管理器? 首先, ...
- 【Python】【上下文管理器】
"""#[备注]#1⃣️try :仅当try块中没有异常抛出时才运行else块.#2⃣️for:仅当for循环运行完毕(即for循环没有被break语句终止)才运行els ...
随机推荐
- Spring异步事件
1.发布事件 @Data public class CustomEvent extends ApplicationEvent implements Serializable { private Boo ...
- locust 性能测试学习 第一天
不废话 1.安装python库 pip install locustio pip install pyzmq 2.脚本 命名为locust_test.py from locust import Htt ...
- 第98天:CSS3中transform变换详解
transform变换详解 本文主要介绍变形transform. Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放sc ...
- POJ2823_Sliding Window
以前也碰到过这种类型的题目,以前好像做出来过,但是忘记了,这次又坑了. 题目很简单,对于从前到后每一个连续的长度为k的数字,求出这段数字中的最大的数字和最小的数字. 一开始我用离散化+树状数组来更新和 ...
- uva1391-Astronauts
宇航员执行任务,有三个任务ABC.把宇航员按照平均年龄分成新老两组,老宇航员可以去AC,新宇航员可以取BC.宇航员之间有不能共存关系,问是否有合法的分配方案. 分析 虽然有三个任务,但每个宇航员还是只 ...
- BZOJ 1799 同类分布(数位DP)
给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1<=a<=b<=1e18. 注意到各位数字之和最大是153.考虑枚举这个东西.那么需要统计的是[0,a-1]和[0,b ...
- bzoj2383[CEOI2011] ballons
题意 在一条数轴上从左向右有一些气球,每个气球一开始位于横坐标xi的位置,是半径为0的圆.现在开始从左向右给每个气球充气.被充气的气球的半径会不断变大,直到达到这个气球的半径上限Ri或者这个气球和之前 ...
- 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash
题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...
- day 008 文件操作
08. 万恶之源-⽂文件操作本节主要内容:1. 初识⽂文件操作2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 其他操 ...
- Seek the Name, Seek the Fame POJ - 2752(拓展kmp || kmp)
题意: 就是求前缀和后缀相同的那个子串的长度 然后从小到大输出 解析: emm...网上都用kmp...我..用拓展kmp做的 这就是拓展kmp板题嘛... 求出extend数组后 把exten ...