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__
,但这似乎只适用于属性。还是我想做的事情真的不可能?