前言

关于计算器运行的上下文的概念,我的理解也不是很深;按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到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,并终止程序。

总结上下文管理器的完整的原理

  1. 初始化获取一个上下文管理器对象;

  2. 加载上下文管理器的 exit() 方法备用;

  3. 调用上下文管理器的 enter() 方法;如果有 as f从句,则将 enter() 方法的返回值赋给f;

  4. 执行主体逻辑代码块;

  5. 调用上下文管理器的 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')
  • 说明:
  1. 先初始化一个ContextTest上下文管理器对象,得到一个对象的生成器test()

  2. 加载上下文管理器的 exit() 方法备用;

  3. 调用上下文管理器的 enter() 方法;执行next()方法唤醒test()生成器,执行yield关键字前面的代码;

  4. 执行主体逻辑代码;

  5. 调用上下文管理器的 exit() 方法;该方法调用next()方法再次唤醒生成器,执行yield关键字后面的代码;

参考

python基础之上下文管理器的更多相关文章

  1. Python之上下文管理器

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之上下文管理器 #http://python.jobbole.com/82620/ #语法形式: ...

  2. (转)Python中的上下文管理器和Tornado对其的巧妙应用

    原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...

  3. with和上下文管理器

    with和上下文管理器 如果你有时间阅读源码的习惯,可能会看到一些优秀的代码会出现带有with关键字的语句. 对于系统资源如文件,数据库连接,socket而言,应用程序打开这些资源并执行完业务逻辑之后 ...

  4. Python with语句和上下文管理器

    open("FishC.txt","w")#此处需注意如果被打开的文件中,已有内容,那么用w的方式打开,则会导致原文件内容被截断,也就是相当于被清空了,然后重新 ...

  5. python基础5之装饰器

    内容概要: 一.装饰器前期知识储备 1.python解释函数代码过程: python解释器从上往下顺序解释代码,碰到函数的定义代码块不会立即执行它,而是将其放在内存中,等到该函数被调用时,才执行其内部 ...

  6. 深入理解 Python 中的上下文管理器

    提示:前面的内容较为基础,重点知识在后半段. with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管 ...

  7. Python深入02 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  8. Python中的上下文管理器和with语句

    Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围.本文是针对于该功能的思考总结. 为什么需要上下文管理器? 首先, ...

  9. 【Python】【上下文管理器】

    """#[备注]#1⃣️try :仅当try块中没有异常抛出时才运行else块.#2⃣️for:仅当for循环运行完毕(即for循环没有被break语句终止)才运行els ...

随机推荐

  1. wpf下使用NotifyIcon

    以前在winForm下使用过NotifyIcon,到wpf找不到了,在wpf下还是直接用WinForm里的那个NotifyIcon实现最小到系统托盘 定义一个NotifyIcon成员 : Notify ...

  2. 【Java】POI的HSSFRichTextString介绍

    在使用Apache的POI库生成EXCEL文件时,经常会遇到这样的情况:使用不同的格式格式化一个单元格中的内容,比如说:一个单元格的内容是“first, second”,现在要分别使用红色带删除线格式 ...

  3. 51nod1222 最小公倍数计数 莫比乌斯反演 数学

    求$\sum_{i = 1}^{n} \sum_{j = 1}^{i} [lcm(i, j) \le n]$因为这样不好求,我们改成求$\sum_{i = 1}^{n} \sum_{j = 1}^{n ...

  4. java如何优雅的实现时间控制

    前言:最近小王同学又遇到了一个需求:线上的业务运行了一段时间,后来随着使用人数增多,出现了一个问题是这样的,一个订单会重复创建几次,导致数据库里出现了很多垃圾数据.在测试同学的不断测试下,发现问题出在 ...

  5. 怎样才能高效地使用JQuery

    1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能.下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的jQ ...

  6. Emgu.CV.CvInvoke”的类型初始值设定项引发异常

    http://zhidao.baidu.com/link?url=VHkw3qZxp7HumQX_r-4ljPiy-N4A7yNK1Xn5q6tjPb16WvBGy6RFKrmKEhtgJ2PACAk ...

  7. PID控制算法的C语言实现九

    (1)微分先行PID控制算法 微分先行PID控制的特点是只对输出量yout(k)进行微分,而对给定值rin(k)不进行微分.这样,在改变给定值时,输出不会改变,而被控量的变化通常是比较缓和的.这种输出 ...

  8. 题解【bzoj2301 [HAOI2011]Problem b】

    Description 求有多少个数对 \((x,y)\) ,满足$ a \leq x \leq b$ ,\(c \leq y \leq d\) ,且 \(\gcd(x,y) = k\),\(\gcd ...

  9. MyEclipse解决Launching xx on MyEclipse Tomcat has encountered a problem

    单击工具栏Run,选中Run Configurations... 将MyEclipse Server Application里面的工程右击选择Delete就好了.

  10. background(css复合写法)

    1. 背景-background========================================================== 单个属性的写法 .sample1 { /*背景颜色 ...