私はPythonが初めてで、他の人のコードを読んでいます:
urllib.urlopen()
の後にurllib.close()
?を付ける必要があります。そうしないと、接続がリークしますよね?
close
メソッドは、あなたが考えているようにモジュール自体ではなく、の結果に対して呼び出す必要があります(あなたが言うように-これは存在しません)。urllib.urlopen
urllib
urllib.close
最善のアプローチ:x = urllib.urlopen(u)
etcの代わりに、以下を使用します。
import contextlib
with contextlib.closing(urllib.urlopen(u)) as x:
...use x at will here...
with
ステートメントとコンテキストマネージャーはclosing
、例外が存在する場合でも適切なクロージャーを保証します。
@Peter が言うように、範囲外の開かれた URL はガベージ コレクションの対象になります。
urllib.py
ただし、次のように定義されていることにも注意してください。
def __del__(self):
self.close()
これは、そのインスタンスの参照カウントが 0 に達すると、その__del__
メソッドが呼び出され、したがってそのclose
メソッドも呼び出されることを意味します。参照カウントがゼロになる最も「通常の」方法は、単にインスタンスをスコープ外に出すことですが、明示的なdel x
早期実行を厳密に止めるものは何もありません (ただし、直接呼び出すのではなく__del__
、参照カウントを 1 つ減らすだけです)。 )。
リソースを明示的に閉じるのは確かに良いスタイルです (特に、アプリケーションが前述のリソースを使いすぎるリスクがある場合)。しかし、(循環?) 参照を維持するような面白いことをしなければ、Pythonは自動的にクリーンアップします。もう必要のないインスタンスに。
厳密に言えば、これは本当です。しかし実際には、一度 (if)urllib
範囲外になると、接続は自動ガベージ コレクターによって閉じられます。