Python ftplib:如何正确释放连接对象?
Python ftplib: How to correctly release connection object?
我见过这样的代码(Python 3 个代码):
import ftplib
from contextlib import closing
with closing(ftplib.FTP()) as ftp:
是否需要使用closing
方法?在一个有趣的 answer 中,我们可以读到在数据库连接对象中,上下文管理器的 __exit__
方法不会关闭连接(至少对于 SQLite 不会),而是提交一个事务。因此,使用closing
方法是很有必要的。
Python 的 FTP class 怎么样?
查看 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
方法被调用因此我认为我们不必为 Python 3 使用 closing
方法。所以我们可以只使用:
with (ftplib.FTP()) as ftp:
由于 Python 2 中缺少 __exit__
方法,Python 2 代码需要 closing
。
这是正确的吗?
大部分你都回答了你自己的问题。
根据评论中的讨论,这是一个合理的问题,因为互联网是 "littered with incorrect code examples".
为了澄清我的简短回答,这是一个遗留问题,Python3 代码在 Python2 上无法按预期执行。因此,互联网上的(好的)示例有望包括对 运行 宁 Python2 中代码的危险的解释。或者他们将使代码向后兼容并进行小修改。
这是一个例子,其中 closing()
用于模拟 Python3 的新功能,而代码是 运行 on Python2。
Python2 (ftplib) 既没有 __enter__
也没有 __exit__
函数,因此呈现上下文句柄 "useless" (除了使其向前兼容,更易于阅读 IMO,并且还将调用分配给变量,在本例中为 ftp
).
为了使其无用,作者根据 Python3.
在调用周围使用了 closing()
来获得自动关闭
如果您完全使用Python3,这是多余的并且可能会减慢您的代码速度(极少)。如果您不想向后兼容,您可以跳过那段特定的代码。
我见过这样的代码(Python 3 个代码):
import ftplib
from contextlib import closing
with closing(ftplib.FTP()) as ftp:
是否需要使用closing
方法?在一个有趣的 answer 中,我们可以读到在数据库连接对象中,上下文管理器的 __exit__
方法不会关闭连接(至少对于 SQLite 不会),而是提交一个事务。因此,使用closing
方法是很有必要的。
Python 的 FTP class 怎么样?
查看 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
方法被调用因此我认为我们不必为 Python 3 使用 closing
方法。所以我们可以只使用:
with (ftplib.FTP()) as ftp:
由于 Python 2 中缺少 __exit__
方法,Python 2 代码需要 closing
。
这是正确的吗?
大部分你都回答了你自己的问题。
根据评论中的讨论,这是一个合理的问题,因为互联网是 "littered with incorrect code examples".
为了澄清我的简短回答,这是一个遗留问题,Python3 代码在 Python2 上无法按预期执行。因此,互联网上的(好的)示例有望包括对 运行 宁 Python2 中代码的危险的解释。或者他们将使代码向后兼容并进行小修改。
这是一个例子,其中 closing()
用于模拟 Python3 的新功能,而代码是 运行 on Python2。
Python2 (ftplib) 既没有 __enter__
也没有 __exit__
函数,因此呈现上下文句柄 "useless" (除了使其向前兼容,更易于阅读 IMO,并且还将调用分配给变量,在本例中为 ftp
).
为了使其无用,作者根据 Python3.
closing()
来获得自动关闭
如果您完全使用Python3,这是多余的并且可能会减慢您的代码速度(极少)。如果您不想向后兼容,您可以跳过那段特定的代码。