У меня есть менеджер контекста, который фиксирует вывод строки для блока кода с отступом в соответствии с оператором 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()'. gain? –
Что не так? stringIO? –
@Mike: В основном, что пользователь хочет строку, а не объект, который должен быть преобразован в строку. – kindall