WITH语句块用于使用上下文管理器定义的方法。语法结构如下:
1 | with_stmt ::= "with" with_item ("," with_item)* ":" suite |
我们经常会用到文件读写:
1 | f = open("a.txt", "r") |
使用with语句块可以这么写:
1 | with open("a.txt", "r") as f: |
也可以同时打开多个文件:
1 | with open("a.txt", "r") as a, open("b.txt", "r") as b: |
我们还可以定义自己的类使用with语句,只需要实现__enter__
、__exit__
这两个函数,
详见With Statement Context Managers:
1 | class A(object): |
除了上面那种方法之外,还可以使用contextlib.contextmanager装饰器:
1 | from contextlib import contextmanager |
注意,被装饰的方法必须返回一个可迭代的对象,并且只能有一个值,这个值作为with
语句块的as
语句的内容,
另外,在yield
之后需要释放对应的资源。所以,推荐的写法如上,被装饰的方法前半部分获取相应的资源,
然后yield
出来,后半部分释放对应的资源。推荐try...except...finally...
写法。