У меня есть менеджер контекста, который записывает вывод в строку для блока кода с отступом под оператором 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__
, но, похоже, он работает только с атрибутами.Или то, что я хочу сделать, на самом деле не возможно?