Python Keywords: with

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2024/11/22/python-keywords-with/

with 是 python 中的一个关键字。 一种更简单的方式实现 try...catch

例如, 打开文件后获得文件句柄f, 无论执行是否正常都需要关闭句柄。

1
2
3
4
5
6

try:
    f = open("file.txt", "r")
    f.write("Hello, World!")
finally:
    f.close()

但是使用 with 关键字, 就可以简单的写成如下

1
2
with open("file.txt", "w") as f:
    f.write("Hello, World!")

with...as 的类实现: ContextManager

with 执行的对象需要实现两个 内置方法

  1. __enter__()
  2. __exit__()

只要有这两个方法, 就算实现了 ContextManager, 就可以使用 with 捕获。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class MyContextManager:
    def __enter__(self):
        print("Entered")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exited")

    def do_something(self):
        print("Doing something")

这个有点像 golang 中的接口

1
2
3
4
type WithContextManager interface{
    Enter()
    Exit()
}

with...as 的函数实现

除了类之外, 函数也可以通过 contextlib 的方式实现 Context Manager

注意: contextlib 是标准库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from contextlib import contextmanager

@contextmanager
def my_file():
    try:
        f = open("file.txt", "w")
        yield f
        # return f ## 错误的, 会直接退出
    finally:
        f.close()
        print("File closed")

with my_file() as f:
    f.write("Hello, World!")
    print("file update")

注意: 这里 只能 使用 yield 返回句柄。

参考文档

  1. Write Your Context Manager Methods in Python