内置open()
可以用作函数或上下文管理器。
f = open(filename)
f.read()
with open(filename) as f:
f.read()
我想编写自己的函数,也可以在两种方式中使用。为了简化示例,假设我想实现一个函数myopen()
。
@contextlib.contextmanager
def myopen(filename):
try:
f = open(filename)
yield f
finally:
f.close()
>>> myopen(somefile)
<contextlib.GeneratorContextManager at 0x2b6bf7727610>
它返回GeneratorContextManager
而不是文件对象。
class myopen(object):
def __init__(self, filename):
self.filename = filename
self.file = None
def __enter__(self):
self.file = open(filename)
return self.file
def __exit__(self):
self.file.close()
def __call__(filename):
return open(filename)
>>> myopen(somefile)
__main__.myopen
调用该类显然会创建一个实例。我必须创建一个实例并调用它(f = myopen(somefile)()
)。