3

withPythonのキーワードでうまく機能するオブジェクトを作成しようとしています。__enter__メソッドを作成する必要があることは理解していますが__exit__、オブジェクトをどのように操作するかはよくわかりません。具体的な例として、作業用のローカルスペースを作成し、終了時にクリーンアップするクラスを作成しました。

import tempfile, os, shutil
class temp_workspace(object):

    def __enter__(self):
        self.local_dir = os.getcwd()
        self.temp_dir  = tempfile.mkdtemp()
        os.chdir(self.temp_dir)

    def __exit__(self, exc_type, exc_value, traceback):
        os.chdir(self.local_dir)
        shutil.rmtree(self.temp_dir)

    def __repr__(self):
        return self.temp_dir

これは問題なく機能しますが、ローカルディレクトリ名を出力しようとすると次のようになります。

with temp_workspace() as T:
    print "Temp directory name is ", T

それはとして現れ、None呼ば__repr__れることさえありません!Tもなので、本当に紛らわしいNoneTypeです。私は何が間違っているのですか?

4

1 に答える 1

5

context manager protocol で__enter__指定されたオブジェクトを返していません。メソッドの最後に追加します。return self__enter__

于 2013-01-21T04:57:03.577 に答える