例子:
def foo(filename):
with open(filename) as f:
tmp=f.readlines()
print(tmp)
f=foo('../t.txt')
f
什么是上下文管理器:
任何实现了
__enter__()
和__exit__()
方法的对象都可称之为上下文管理器,上下文管理器对象可以使用with
关键字。XXX类实现了上下文管理器,就可以使用with
语句
class File():
def __init__(self,filename,mode):
self.filename=filename
self.mode=mode
pass
def __enter__(self):
print('entering')
self.f=open(self.filename,self.mode)
return self.f
def __exit__(self, *args):
print('exit')
self.f.close()
with File('../t.txt','r') as f:
print([i for i in f.readlines()])
with File('../t.txt','w') as f:
f.write("hi")
实现上下文管理器的另外方式:
Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。
通过 yield 将函数分割成两部分:
- yield 之前的语句在enter方法中执行,
- yield 之后的语句在 exit 方法中执行。
紧跟在 yield 后面的值是函数的返回值。
from contextlib import contextmanager
@contextmanager
def my_open(path,mode):
f=open(path,mode)
yield f
f.close()
with my_open("../t.txt","r") as f:
print(f.readlines())
#Python 提供了 with 语法用于简化资源操作的后续清除操作,
# 是 try/finally 的替代方法,实现原理建立在上下文管理器之上。
# 此外,Python 还提供了一个 contextmanager 装饰器,更进一步简化上下管理器的实现方式
2023-04-27
网友评论