非常教程

Python参考手册

运行 | Runtime

contextlib

2.5版本中的新功能。

源代码: Lib / contextlib.py

该模块为涉及该with语句的常见任务提供实用程序。有关更多信息,请参阅上下文管理器类型和使用语句上下文管理器。

提供的功能:

contextlib.contextmanager(func)

该函数是一个装饰器,可用于为语句上下文管理器定义工厂函数,而无需创建类或单独的__enter __()和__exit __()方法。

一个简单的例子(这不建议作为生成HTML的真正方法!):

from contextlib import contextmanager

@contextmanager
def tag(name):
    print "<%s>" % name
    yield
    print "</%s>" % name

>>> with tag("h1"):
...    print "foo"
...
<h1>
foo
</h1>

被调用的函数在调用时必须返回一个生成器引发器。此迭代器必须产生恰好一个值,该值将绑定到with语句as子句中的目标(如果有的话)。

在发生器产生的点上,嵌套在with语句中的块被执行。该模块退出后,发电机恢复运行。如果块中发生未处理的异常,则在发生产量的位置将其重新发送到生成器中。因此,你可以使用一个try... except... finally语句来捕获错误(如果有的话),或确保一些清理发生。如果一个异常仅仅为了记录它或者执行一些操作而被捕获(而不是完全压制它),那么生成器必须重新评估该异常。否则,生成器上下文管理器将向with语句指示该异常已被处理,并且执行将随着语句紧随该with语句而继续。

contextlib.nested(mgr1[, mgr2[, ...]])

将多个上下文管理器组合成一个嵌套的上下文管理器。

此功能已被弃用,以支持该with报表的多个管理形式。

这个函数比with声明的多个管理器形式的优点是,解析参数允许它与可变数目的上下文管理器一起使用,如下所示:

from contextlib import nested

with nested(*managers):
    do_something()

请注意,如果__exit__()其中一个嵌套上下文管理器的方法指示应该抑制异常,则不会将任何异常信息传递给任何其余的外部上下文管理器。同样,如果__exit__()其中一个嵌套管理器的方法引发异常,则以前的任何异常状态都将丢失; 新的异常将传递给__exit__()任何剩余的外部上下文管理器的方法。一般而言,__exit__()方法应该避免引发异常,尤其是不应该重新提出通过的异常。

这个函数有两个主要的奇怪特点,导致它被弃用。首先,作为上下文管理器都被构造在调用函数前,__new__()__init__()内上下文管理器的方法并不实际上由外上下文管理器的范围所覆盖。这意味着,例如,使用nested()打开两个文件是一个编程错误,因为如果在打开第二个文件时引发异常,第一个文件不会立即关闭。

其次,如果__enter__()内部上下文管理器之一的方法引发了被__exit__()外部上下文管理器之一的方法捕获和压制的异常,则此构造将引发RuntimeError而不是跳过with语句的主体。

需要支持嵌套可变数量的上下文管理器的开发人员可以使用该warnings模块来抑制由此函数引发的DeprecationWarning,或者将此函数用作特定于应用程序的实现的模型。

自2.7版弃用:with-statement现在直接支持此功能(没有令人困惑的错误倾向)。

contextlib.closing(thing)

返回一个上下文管理器,在完成该块后关闭事物。这基本相当于:

from contextlib import contextmanager

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

并让你编写这样的代码:

from contextlib import closing
import urllib

with closing(urllib.urlopen('http://www.python.org')) as page:
    for line in page:
        print line

而不需要明确关闭page。即使发生错误,page.close()with块被退出时也会被调用。

扩展内容

PEP 343 - “with”语句Pythonwith语句的规范,背景和示例。

Python

Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于1989年发明,第一个公开发行版发行于1991年。 Python 是纯粹的自由软件, 源代码和解释器 CPython 遵循 GPL 协议。Python 语法简洁清晰,特色之一是强制用空白符( white space )作为语句缩进。

主页 https://www.python.org/
源码 https://github.com/python/cpython
版本 2.7
发布版本 2.7.13

Python目录

1.内置常量 | Built-in Constants
2.内置例外 | Built-in Exceptions
3.内置函数 | Built-in Functions
4.内置类型 | Built-in Types
5.编译器 | Compiler
6.加密 | Cryptography
7.数据压缩 | Data Compression
8.数据持久性 | Data Persistence
9.数据类型 | Data Types
10.调试和分析 | Debugging & Profiling
11.开发工具 | Development Tools
12.文件和目录访问 | File & Directory Access
13.文件格式 | File Formats
14.构架 | Frameworks
15.输入 | Importing
16.输入/输出 | Input/ouput
17.国际化 | Internationalization
18.网络 | Internet
19.网络数据 | Internet Data
20.翻译 | Interpreters
21.语言 | Language
22.记录 | Logging
23.Mac OS
24.MS Windows
25.多媒体 | Multimedia
26.联网 | Networking
27.数字与数学 | Numeric & Mathematical
28.操作系统 | Operating System
29.可选操作系统 | Optional Operating System
30.限制执行 | Restricted Execution
31.运行 | Runtime
32.SGI IRIX
33.软件包装与分销 | Software Packaging & Distribution
34.字符串 | String
35.结构化标记 | Structured Markup
36.Tk
37.Unix
38.Python 简介
39.Python pass 语句
40.Python 循环嵌套
41.Python 运算符
42.Python log10() 函数
43.Python log() 函数
44.Python floor() 函数
45.Python fabs() 函数
46.Python exp() 函数
47.Python cmp() 函数
48.Python ceil() 函数
49.Python abs() 函数
50.Python Number(数字)
51.Python pow() 函数
52.Python modf() 函数
53.Python min() 函数
54.Python max() 函数
55.Python asin() 函数
56.Python acos() 函数
57.Python uniform() 函数
58.Python shuffle() 函数
59.Python seed() 函数
60.Python random() 函数
61.Python randrange() 函数
62.Python choice() 函数
63.Python sqrt() 函数
64.Python round() 函数
65.Python radians() 函数
66.Python degrees() 函数
67.Python tan() 函数
68.Python sin() 函数
69.Python hypot() 函数
70.Python cos() 函数
71.Python atan2() 函数
72.Python atan() 函数
73.Python 元组
74.Python 列表(List)
75.Python 字符串
76.Python 字典(Dictionary)
77.Python 日期和时间
78.Python 函数
79.Python 模块
80.Python capitalize()方法
81.Python center()方法
82.Python count() 方法
83.Python expandtabs()方法
84.Python endswith()方法
85.Python encode()方法
86.Python decode()方法
87.Python find()方法
88.Python index()方法
89.Python 异常处理
90.Python isspace()方法
91.Python isnumeric()方法
92.Python islower()方法
93.Python isdigit()方法
94.Python isalpha()方法
95.Python isalnum()方法
96.Python isupper()方法
97.Python istitle()方法
98.Python min()方法
99.Python max()方法
100.Python maketrans()方法