最近突发奇想,想写一个能改变当前输出环境,输出彩色文字的上下文管理器,于是学习了一下上下文管理。
1. 简介
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。一个最简单的例子:
1 | with file("a.txt", "r") as f: |
2. 编写上下文管理器
为一个类编写上下文管理器时,需要定义类的__enter__
和__exit__
函数。
2.1 __enter__函数
__enter__
函数规定如下:
contextmanager.__enter__()
Enter the runtime context and return either this object or another object related to the runtime context. The value returned by this method is bound to the identifier in the as clause of with statements using this context manager.
进入当前上下文,并返回当前对象或另一个与当前上下文相关的对象。被该函数返回的变量会通过该上下文管理器与with文法中as后的声明所绑定。
例:
1 | class BracketAdder(object): |
2.2 __exit__函数
__exit__
函数格式如下:
contexmanager.__exit__(exc_type, exc_val, exc_tb)
文档太长懒得翻译了_(:зゝ∠)_
如果代码块中出现异常,exc_type
为异常类型,exc_val
为该异常,exc_tb
为traceback.__exit__
函数应返回一个bool类型,若返回值为True
, 则在代码块及__exit__
函数运行结束后不会抛出任何异常,然后立即执行后面的代码;若返回值为False
,则在__exit__
函数运行结束后抛出异常。
若代码块中未出现异常,则三个变量均为None
.
例:
1 | class BracketAdder(object): |
3. 综合示例
1 | # coding: utf-8 |
程序输出:
1 | I'm entering the context |
4. 参考文档
5. 后记
这些小知识点平时只是粗略的看一下,只能达到会用的程度,有时候觉得只有自己整理一遍才能真正理解它们,才能熟练运用。
所以…又填完一个坑。周末简单写写PyQt4吧…