如何编写一个可以调用并用作上下文管理器的函数?

时间:2018-06-13 13:57:17

标签: python contextmanager

内置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)())。

0 个答案:

没有答案
相关问题