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,并终止程序。

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

  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关键字后面的代码;

原文地址:https://www.cnblogs.com/cwp-bg/p/8601087.html

时间: 2024-08-02 23:10:39

python之上下文管理器的相关文章

8.python之上下文管理协议

使用上下文管理协议,有什么好处? 使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预. 在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处. 之前所提到的with代码块,就是python的上下文管理操作,比如说通过python打开一个文件,就可以通过with代码块结合open去实现,通过这种方式打开的文件,执行了相应的操作后,无需我们手动去close文件,文件

python之上下文管理、redis的发布订阅

使用with打开文件的方式,是调用了上下文管理的功能 1 #打开文件的两种方法: 2 3 f = open('a.txt','r') 4 5 with open('a.txt','r') as f 6 7 实现使用with关闭socket 8 import contextlib 9 import socket 10 11 @contextlib.contextmanage 12 def Sock(ip,port): 13 socket = socket.socket() 14 socket.bi

Python之上下文管理协议

一.上下文管理协议 <1>常规操作3步open: 1.f = open('a.txt') 2.对文件的操作 3.f.close() 上边两种操作 第二种操作因为打开文件之后必须关闭,不关闭占用内存的资源 而上下文管理协议就不会, 内存采用回收机制自动的去把对象清理掉 好处就是可以在exit方法中自动释放资源 <2>with with open('a.txt') as f: '代码块'上述就是上下文管理协议 __enter__ __exit__ 1 class Foo: 2 3 de

with和上下文管理器

with和上下文管理器 如果你有时间阅读源码的习惯,可能会看到一些优秀的代码会出现带有with关键字的语句. 对于系统资源如文件,数据库连接,socket而言,应用程序打开这些资源并执行完业务逻辑之后,必须要做的事情就是关闭该资源. 在上篇文件中,我们读写文件操作,完毕之后,关闭文件对象.调用close方法,下面来看看如何正确的关闭一个文件. 普通版 def func(): f = open("1.txt", "w") f.write("Python&qu

谈一谈Python的上下文管理器

经常在Python代码中看到with语句,仔细分析下,会发现这个with语句功能好强,可以自动关闭资源.这个在Python中叫上下文管理器Context Manager.那我们要怎么用它,什么时候用它呢.这里我们就来聊一聊. 上下文管理器的作用 很多情况,当我们使用完一个资源后,我们需要手动的关闭掉它,比如操作文件,建立数据库连接等.但是,在使用资源的过程中,如果遇到异常,很可能错误被直接抛出,导致来不及关闭资源.所以在大部分程序语言里,我们使用"try-finally"语句来确保资源

python使用上下文管理器实现sqlite3事务机制

如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制. 1.python上下文管理(with) python上下文管理(context),解决的是这样一类问题,在进入逻辑之前需要进行一些准备工作,在退出逻辑之前需要进行一些善后工作,上下文管理可以使得这种场景变得清晰和可控. with语句是python上下文管理的基本用法,例如读写文件 with open('filea', r) as f: f.readlines() file使用的就是上下文管理机制

文件操作-with和上下文管理器

代码: 1 # -*- coding:utf-8 -*- 2 # 普通版 如果写入的过程中出错 则不会释放资源 3 def m1(): 4 f = open("test.txt","w") 5 f.write("hello python") 6 f.close() 7 # 进阶版 8 def m2(): 9 f = open("test2.txt","w") 10 try: 11 f.write("

理解Python的上下文管理器

上下文管理器(context manager)是 Python 编程中的重要概念,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语法形式是with...as... 为了确保一些系统资源得以正确释放,我们经常会用到 try ... excepte ... finally 语句.如: try: f = open('somefile') for line in f: print(line) except Exception as e:

windows下python的包管理器pip安装

pip:  安装和管理Python的包的工具 要用到第三方包,python的版本就必须是2.7 https://pypi.python.org/pypi/setuptools#downloads python ez_setup.py https://pip.pypa.io/en/latest/installing.html#python-os-support python get-pip.py