現在の作業ディレクトリを、デコレートされた関数が呼び出される前の状態に復元するデコレータをどのように記述すればよいでしょうか。言い換えると、 を実行する関数でデコレータを使用するとos.chdir()
、関数が呼び出された後に cwd は変更されません。
ベストアンサー1
デコレータの答えは出ました。デコレータは、要求どおりに関数定義段階で機能します。
Python 2.5以降では、関数でこれを行うオプションもあります。電話コンテキストマネージャーを使用したステージ:
from __future__ import with_statement # needed for 2.5 ≤ Python < 2.6
import contextlib, os
@contextlib.contextmanager
def remember_cwd():
curdir= os.getcwd()
try: yield
finally: os.chdir(curdir)
これは、関数呼び出し時に必要に応じて次のように使用できます。
print "getcwd before:", os.getcwd()
with remember_cwd():
walk_around_the_filesystem()
print "getcwd after:", os.getcwd()
それは良い選択肢です。
編集: codeape の提案に従ってエラー処理を追加しました。私の回答は投票で承認されたので、他のすべての問題はさておき、完全な回答を提供するのは公平です。