我应该在urllib.urlopen()之后调用close()吗?

我是Python新手,阅读别人的代码:

urllib.urlopen()后跟urllib.close() ? 否则,会泄漏连接,对吗?

close方法必须在urllib.urlopen结果上调用, 而不是在你正在考虑的urllib模块本身上(正如你提到的urllib.close – 不存在的那样)。

最好的办法:而不是x = urllib.urlopen(u)等,使用:

 import contextlib with contextlib.closing(urllib.urlopen(u)) as x: ...use x at will here... 

with语句和closing上下文pipe理器将确保在出现exception情况下正确closures。

像@Peter说的那样,超出范围的打开的URL将有资格进行垃圾回收。

但是,还要注意urllib.py定义了:

  def __del__(self): self.close() 

这意味着当那个实例的引用计数达到零时 ,它的__del__方法将被调用,因此它的close方法也会被调用。 引用计数达到零的最“正常”的方法是简单地让实例超出范围,但没有任何东西严格地阻止你从显式的del x早期(但是它不直接调用__del__而是递减引用算一个)。

显式closures资源当然是一种很好的风格 – 尤其是当你的应用程序冒着使用太多资源的风险时 – 但是如果你不做任何有趣的事情,比如维护(循环)引用,Python 自动清理到你不再需要的实例。

严格来说,这是真的。 但实际上,一旦(如果) urllib超出范围,连接将被自动垃圾收集器closures。