我的功能如下:
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)]
答案 0 :(得分: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
答案 1 :(得分: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/