私はこの(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を見ると
、我々はこれを見つけることができます:
quit
方法は、私たちは、Python 3用
closing
方法を使用する必要はありませんと思いますので、呼ばれ
# 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()
だから我々ちょうど使用することができます。
with (ftplib.FTP()) as ftp:
__exit__
方法は、Python 2に欠けているので、closing
は、Python 2のコードのために必要です。
これは間違いありませんか?
あなた自身の質問に答えました:) Python2では、あなたが述べたとおりです。 '__enter__'関数も' __exit__'関数もありません。コンテキストハンドルは、あなたの場合に変数 'ftp'を代入する以外は何もしません。これは継承であり、後方互換性のあるコンプライアンスです。あなたが後方の忍者に興味がないなら、あなたはそれをスキップすることができます。 – Torxed
@Torxedインターネットは間違ったコード例ではぎとられているので(私は、多くの1回限りの小さなスクリプトではそのような詳細を気にする必要はないと理解しています)、簡単に混乱するので、確認したいと思います。 –
これは完全にうまくいく質問です:)私は人々がこの質問に遭遇した場合に、少し長い答えを書きました。 – Torxed