4

我有一个类似的功能:

def func(filename):
    with open(filename) as f:
        return [line.split('\t')[0] for line in f]

即使有“突然”函数返回,“with”语句是否也会关闭文件?我可以忽略“with”语句吗?即这样做是否安全且等效(从内存泄漏的角度来看),

def func(filename):
    return [line.split('\t')[0] for line in open(filename)]

?

4

2 回答 2

4

它是安全的。__exit__即使您return在上下文中,也会调用上下文管理器,因此文件句柄已正确关闭。

这是一个简单的测试:

class ContextTest(object):
    def __enter__(self):
        print('Enter')

    def __exit__(self, type, value, traceback):
        print('Exit')

def test():
    with ContextTest() as foo:
        print('Inside')
        return

当你打电话时test(),你会得到:

Enter
Inside
Exit
于 2013-05-13T01:12:50.773 回答
0

保证这种安全性实际上是with...as...语法的全部目的;它替换了try/finally块,否则会相当尴尬。所以是的,它保证是安全的,这就是为什么我更with open as f喜欢f = open.

请参阅http://effbot.org/zone/python-with-statement.htm以很好地解释为什么存在语法以及它是如何工作的。__enter__请注意,您可以使用和方法编写自己的类__exit__来真正利用这种语法。

另请参阅此功能的 PEP:http: //www.python.org/dev/peps/pep-0343/

于 2013-05-13T01:40:01.360 回答