【发布时间】:2011-04-24 14:16:32
【问题描述】:
我有一个上下文管理器,它将输出捕获到在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__,但这似乎只适用于属性。还是我想做的事真的不可能?
【问题讨论】:
-
不管这个问题是否有答案,我知道我希望你返回一个实现
__str__的类。我不确定你必须在某个时候通过调用str()明确地说“这是我将其锁定为字符串的地方,没有进一步的更改”。那么有什么收获呢? -
@Mike:主要是用户想要字符串,而不是必须转换为字符串的对象。
-
看起来 UserString (嗯,MutableString,但那会消失)基本上是我想要的,所以我要投票关闭它。编辑:哎呀,我想我真的不能这样做,因为没有一个真正适用的原因。
-
@kindall:然后你把它放在一个答案中,把它标记为正确的,然后继续。链接到 docs.python.org 上的 UserString 和 MutableString 页面的奖励积分。
标签: python string with-statement