我見過這樣的代碼(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