如何使用Python关闭上下文管理器

时间:2011-11-09 19:13:17

标签: python file-io with-statement

标准库open函数既可以作为函数使用:

f = open('file.txt')
print(type(f))
<type 'file'>

或作为上下文管理员:

with open('file.txt') as f:
    print(type(f))
<type 'file'>

我正在尝试使用contextlib.closing模仿此行为,其中File是我的自定义文件I / O类:

def myopen(filename):
    f = File(filename)
    f.open()
    return closing(f)

这可以像上下文管理器一样工作:

with myopen('file.txt') as f:
    print(type(f))
<class '__main__.File'>

但当然如果我直接打电话,我会取回closing对象而不是我的对象:

f = myopen(filename)
print(type(f))
<class 'contextlib.closing'>

那么,我如何实现myopen以便它既可以作为上下文管理器直接调用时返回我的File对象?

github上的完整工作示例:     https://gist.github.com/1352573

1 个答案:

答案 0 :(得分:13)

最简单的方法可能是自己实施__enter____exit__方法。这样的事情应该这样做:

class File(object):
   # ... all the methods you already have ...

   # context management
   def __enter__(self):
       return self
   def __exit__(self, *exc_info):
       self.close()

顺便说一句,在open方法中执行__init__方法的工作会更加惯用。