contextlib模块

说明:contextlib是为了加强with语句,提供上下文机制的模块,它是通过Generator实现的。通过定义类以及写__enter__和__exit__来进行上下文管理;
contextlib中有nested和closing,前者用于创建嵌套的上下文,后则用于帮你执行定义好的close函数.

#!/usr/bin/env python
#coding:utf-8

class WithinContext(object):
    def __init__(self,context):
        print "WithinContext.__init__(%s) " %context
    def do_something(self):
        print "WithinContext.do_something()"
    def __del__(self):
        print "WithinContext.__del__"
class Context(object):
    def __init__(self):
        print "Context.__init__()"
    def __enter__(self):
        """
        在主体代码执行前执行
        """
        print "Context.__enter__()"
        return WithinContext(self)
    def __exit__(self,exc_type,exc_val,exc_tb):
        """
        在主体代码执行后执行
        """
        print "Context.__exit__()"
with Context() as c :
    """
    as后面的变量是在__enter__函数中返回的
    """
    c.do_something()
#执行结果:
Context.__init__()
Context.__enter__()
WithinContext.__init__(<__main__.Context object at 0x7f95045167d0>) 
WithinContext.do_something()
Context.__exit__()
WithinContext.__del__

contextlib中的contextmanager作为装饰器来提供一种针对函数级别的上下文管理机制.

#!/usr/bin/env python
#coding:utf-8

import contextlib

@contextlib.contextmanager
def make_context():
    print "entering"
    try:
        yield {}
    finally:
        print "exiting"
        
with make_context() as value:
    print "inside with statement:", value
    
#执行结果:
entering
inside with statement: {}
exiting

@contextlib.contextmanager
def make_context(name):
    print "entering",name
    yield name
    print "exiting",name
    
with contextlib.nested(make_context(‘A‘)) as (c):
    print "inside with statement: ",c
    
#执行结果:
entering A
inside with statement:  [‘A‘]
exiting A

with contextlib.nested(make_context(‘A‘),make_context("B"),make_context("C")) as (A,B,C):
    """
    nested用于创建嵌套的上下文
    """
    print "inside with statement: ",A,B,C
    
#执行结果:
entering A
entering B
entering C
inside with statement:  A B C
exiting C
exiting B
exiting A

class Door(object):
    def __init__(self):
        print "__init__()"
    def close(self):
        print "close()"
        return
         
with contextlib.closing(Door()) as door:
    """
    closing执行定义好的close函数
    """
    print "inside with statement."
    
#执行结果:
__init__()
inside with statement.
close()
时间: 2024-10-13 12:04:30

contextlib模块的相关文章

Python:contextlib模块——上下文管理器工具

上篇博文简单的讲了下with语句的用法以及上下文管理器对象的概念,想必对上下文管理器对象有一定的了解.一个对象如果实现了上下文管理协议,也就是在类中定义了__enter__()和__exit__()方法两个方法的对象,都可以称为上下文管理器对象. 但是,Python中有个contextlib模块,是个比with优美的东西,提供上下文机制的,它是通过Generator装饰器实现的,不再是采用__enter__和__exit__. contextlib模块对外有三个接口,分别是contextlib.

Python标准库--contextlib模块

contextlib模块:上下文管理器工具 简单实现with...as... as是__enter__返回的对象 __exit__返回True,则不抛出异常,返回False,则抛出异常 class WithinContext: def __init__(self, context): print('Within.__init__: ', context) def do_something(self): print('Within.do_something') raise RuntimeError

Python 上下文管理器模块--contextlib

在 Python 处理文件的时候我们使用 with 关键词来进行文件的资源关闭,但是并不是只有文件操作才能使用 with 语句.今天就让我们一起学习 Python 中的上下文管理 contextlib. 上下文管理器 上下文,简而言之,就是程式所执行的环境状态,或者说程式运行的情景.既然提及上下文,就不可避免的涉及 Python 中关于上下文的魔法.上下文管理器(context manager)是 Python2.5 开始支持的一种语法,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会

python上下文管理器ContextLib及with语句

http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程

Python——with语句、context manager类型和contextlib库

目录 一.with语句 二.上下文管理器 三.contextlib模块 一.with语句 关于 Python 中 with 语句的详细说明:PEP 343 with 语句用上下文管理器定义的方法包裹一段代码的执行,等价于简单版的try...except...finally语句.with语句的主要针对的情境:不论一个代码块的执行过程是否出现异常,都要在结束的时候执行一些操作(比如清理). with语句语法: with_stmt ::= "with" with_item (",&

Py西游攻关之多线程(threading模块)

线程与进程 什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 A thread is an execution context, which is all the information a CPU needs to execute a stream of instructions. Suppose you're reading a

Python 3 笔记

############################################################################################ 内      容: Python 3 # 作     者: 娜爱# 更新日期: 2017.07.18  # 在cmd中执行py文件(路径可加双引号),如:python E:\PythonSrc\mypy_package\eg.py##########################################

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

谈一谈Python的上下文管理器

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