with
ステートメントの下にインデントされたコードのブロックの文字列への出力をキャプチャするコンテキストマネージャーがあります。このコンテキストマネージャーは、ブロックの実行が終了すると、キャプチャされた出力を含むカスタム結果オブジェクトを生成します。
from contextlib import contextmanager
@contextmanager
def capturing():
"Captures output within a 'with' block."
from cStringIO import StringIO
class result(object):
def __init__(self):
self._result = None
def __str__(self):
return self._result
try:
stringio = StringIO()
out, err, sys.stdout, sys.stderr = sys.stdout, sys.stderr, stringio, stringio
output = result()
yield output
finally:
output._result, sys.stdout, sys.stderr = stringio.getvalue(), out, err
stringio.close()
with capturing() as text:
print "foo bar baz",
print str(text) # prints "foo bar baz"
もちろん、文字列を返すことはできません。文字列は不変であるため、ユーザーがwith
ステートメントから取得した文字列は、コードブロックの実行後に変更することはできません。ただし、事後に結果オブジェクトを文字列に明示的に変換する必要があるのは、ちょっとしたドラッグですstr
(オブジェクトを少しの構文糖衣として呼び出し可能にすることも試しました)。
それで、名前が付けられたときに実際に文字列を返すという点で、結果インスタンスを文字列のように動作させることは可能ですか?を実装しようとし__get__
ましたが、それは属性でのみ機能するようです。それとも、私がしたいことは本当に不可能ですか?