2013-08-27 7 views
9

:(?)"with"でtempfile.mkstemp()を呼び出す方法は? - なぜ__exit __()でfdを返さないのですか? <code>tempfile.mkstemp()</code>を呼び出すほとんどの慣用的な方法のようになります私に

with tempfile.mkstemp() as fd, filename: 
    pass 

は、しかし、明らかにこれは、明示的にしようと、最後に使用してこの問題を解決する簡単な方法ですos.close(fd)を呼び出すAttributeError: __exit__

を上げますしかし、違反のように感じるそれを行うには、1つ、好ましくは1つの唯一の方法があるべきです。

これをtempfileに「修正する」方法がありますか、またはこれがこのように実装された理由がありますか?

+4

downvoteありがとうございます、質問を改善する方法をコメントしてください。 – Kimvais

答えて

5

tempfileモジュールには、TemporaryFile()などの一時ファイルを作成するための、より適切な方法があります。

特に、ファイルを削除しない場合は、NamedTemporaryFile()を使用して、delete=False引数を与えます。

7

with文の働きは、そのいわゆるコンテキスト管理プロトコル含む、PEP 343に定義されている:

このPEPはからなるプロトコルが() と出口に入ることを提案 ()メソッドは「コンテキスト管理プロトコル」 と呼ばれ、そのプロトコルを実装するオブジェクトは「コンテキスト マネージャ」と呼ばれます。

mkstempはそれが__enter____exit__メソッドを実装し、したがって互換性がないオブジェクトであり、コンテキストマネージャを返しません。

明白な回避策は、コンテキストマネージャプロトコルを実装するラッパークラスを作成することです。

関連する問題