我见过这样的代码(Python 3的代码):Python ftplib:如何正确释放连接对象?
import ftplib
from contextlib import closing
with closing(ftplib.FTP()) as ftp:
是必要的closing
方法的使用情况如何?在一个有趣的answer中,我们可以读取数据库连接对象中的上下文管理器的__exit__
方法不关闭连接(至少不是SQLite),而是提交事务。因此,使用closing
方法是必要的。
它是如何与Python的FTP类?
了解一下Python FTPLIB的sources,我们可以发现这一点:
# Context management protocol: try to quit() if active
def __exit__(self, *args):
if self.sock is not None:
try:
self.quit()
except (OSError, EOFError):
pass
finally:
if self.sock is not None:
self.close()
的quit
方法被调用,因此我认为我们不必使用closing
方法为Python 3.因此,我们可以只使用:
with (ftplib.FTP()) as ftp:
__exit__
由于方法在Python 2丢失,closing
是必要的Python 2代码。
这是正确的吗?
你已经回答了你自己的问题:)在Python2中,就像你说的。没有'__enter__'函数或'__exit__'函数,那里的上下文句柄在进入或退出时不会做任何事情,除非在你的情况下分配变量'ftp'。所以这是一个继承和向后兼容的遵从性事情。如果你不想成为逆向忍者,你可以跳过它。 – Torxed
@Toxxed由于互联网上充斥着不正确的代码示例(我明白,在很多一次性小脚本中,您不需要打扰这些细节),所以很容易混淆,所以我想要确认。 –
问这是一个完全正确的问题:)我写了一个更长的答案,以防人们在这个问题上磕磕绊绊。 – Torxed