2011-01-16 14 views
1

Javaのすべてのバージョンでは、リソースを手動で閉じる必要があります。通常はfinallyブロックで処理されます。 Java 7はARM(自動リソース管理)ブロックを取得しようとしています。pythonには自動リソース管理はありますか?

  1. まず、pythonでfinallyブロックの概念が表示されません。または、発生した例外ごとにキャッチのリソースを閉じますか?
  2. PythonでARMを実行するライブラリはありますか?そうでない場合は、ARMを行うためのpythonic方法は何ですか?
+1

てみドキュメントhttp://docs.python.org/tutorial/errors.htmlやGoogle:http://www.google.com/searchここ

は、標準出力をリダイレクトする簡単な例であります?q = exceptions + finally + pythonあなたは 'with'ステートメントに興味がありますhttp://docs.python.org/reference/compound_stmts.html#with –

答えて

8

try:except:finally:in pythonがあります。

また、with:文を使用することもできます。これは、ARMのためのものです。これらはコンテキストマネージャと呼ばれます。 http://www.python.org/dev/peps/pep-0343/

+0

とてもいいです。私はPythonに絶えず驚いています。 –

2

Pythonで自動化されたリソース管理があります。リソースを開いているほとんどのオブジェクトは、ガベージコレクションが行われると、リソースを閉じます。それは未定義で、まったく発生しない可能性があるので、これは非常に多くのリソースを使用していない場合にのみ機能し、プログラムが開いているときには気にしないでください。終了します。

それ以外の場合は、マシューズの回答に従ってコンテキストマネージャーとwithステートメントを使用してください。

>>> import sys 
>>> class redirect_stdout: 
...  def __init__(self, target): 
...   self.stdout = sys.stdout 
...   self.target = target 
... 
...  def __enter__(self): 
...   sys.stdout = self.target 
... 
...  def __exit__(self, type, value, tb): 
...   sys.stdout = self.stdout 
... 
>>> from StringIO import StringIO 
>>> out = StringIO() 
>>> with redirect_stdout(out): 
...  print 'Test' 
... 
>>> out.getvalue() == 'Test\n' 
True 
関連する問題