我今天第一次遇到Python with语句。我已经简单地使用Python几个月了,甚至不知道它的存在!鉴于它的地位有些模糊,我认为有必要问一下:

Python with语句是什么 设计用于? 是什么 你用它干什么? 有吗? 我需要注意的问题,还是 相关联的常见反模式 它的使用?在什么情况下try. finally比with更好? 为什么它没有被更广泛地使用呢? 哪些标准库类与它兼容?


当前回答

这里的答案很棒,但我只想补充一个帮助我的简单答案:

with open("foo.txt") as file:
    data = file.read()

Open返回一个文件 自2.6以来,python在文件中添加了__enter__和__exit__方法。 With类似于一个for循环,调用__enter__,运行一次循环,然后调用__exit__ With作用于任何具有__enter__和__exit__的实例

在__exit__关闭文件之前,文件是锁定的,不能被其他进程重用。

来源:http://web.archive.org/web/20180310054708/http: / / effbot.org/zone/python-with-statement.htm

其他回答

这里的答案很棒,但我只想补充一个帮助我的简单答案:

with open("foo.txt") as file:
    data = file.read()

Open返回一个文件 自2.6以来,python在文件中添加了__enter__和__exit__方法。 With类似于一个for循环,调用__enter__,运行一次循环,然后调用__exit__ With作用于任何具有__enter__和__exit__的实例

在__exit__关闭文件之前,文件是锁定的,不能被其他进程重用。

来源:http://web.archive.org/web/20180310054708/http: / / effbot.org/zone/python-with-statement.htm

Python with语句是c++中常用的“资源获取即初始化”习语的内置语言支持。它的目的是允许安全获取和释放操作系统资源。

with语句在作用域/块内创建资源。您可以使用块中的资源编写代码。当块退出时,无论块中代码的结果如何(即块是正常退出还是因为异常退出),资源都将被干净地释放。

Python库中的许多资源遵循with语句所要求的协议,因此可以与它一起开箱即用。然而,任何人都可以通过实现记录良好的协议PEP 0343来创建可以在with语句中使用的资源

当您在应用程序中获取必须显式放弃的资源(如文件、网络连接、锁等)时,请使用它。

第1点、第2点和第3点得到了很好的阐述:

4:它相对较新,仅在python2.6+中可用(或python2.5使用from __future__ import with_statement)

我想推荐两堂有趣的课:

PEP 343 with语句 Effbot理解Python的 ”与“声明

1. with语句用于用上下文管理器定义的方法包装块的执行。这允许普通的尝试…最后对使用模式进行封装,以方便重用。

2. 你可以这样做:

with open("foo.txt") as foo_file:
    data = foo_file.read()

OR

from contextlib import nested
with nested(A(), B(), C()) as (X, Y, Z):
   do_something()

OR (Python 3.1)

with open('data') as input_file, open('result', 'w') as output_file:
   for line in input_file:
     output_file.write(parse(line))

OR

lock = threading.Lock()
with lock:
    # Critical section of code

3. 我在这里没有看到任何反模式。 深入了解Python:

试一试,终于好了。有更好。

4. 我想这与程序员使用try..catch..的习惯有关。最后是来自其他语言的语句。

参见PEP 343 - 'with'语句,末尾有一个示例部分。

... 新的语句"with"到Python 制造语言 可以排除try/finally语句的标准用法。