Список строк, которые нужно объединить с ''.join
, просто в порядке. Однако, если вы предпочитаете более прямое решение:
import cStringIO
class MyWriter(object):
def __init__(self, stdout):
self.stdout = stdout
self.dumps = cStringIO.StringIO()
self.final = None
def write(self, text):
self.stdout.write(smart_unicode(text).encode('cp1251'))
self.dumps.write(text)
def close(self):
self.stdout.close()
self.final = self.dumps.getvalue()
self.dumps.close()
def getvalue(self):
if self.final is not None:
return self.final
return self.dumps.getvalue()
getvalue
нельзя вызвать для объекта string-io после его закрытия (закрытие объекта приводит к удалению его собственной буферной памяти), поэтому я делаю self.final
непосредственно перед тем, как это произойдет. Помимо getvalue
, объект string-io является довольно точной реализацией интерфейса «файлоподобный объект», поэтому он часто оказывается полезным, когда вам просто нужен какой-то фрагмент кода, изначально разработанный для print
результаты, вместо этого сохраните их в памяти; но это также потенциально аккуратный способ «построить строку по частям» - просто write
каждый кусок и getvalue
, когда закончите (или в любое время в процессе, чтобы увидеть, что вы собрали до сих пор).
В современном стиле Python для этой задачи часто предпочитают подход с более низкой абстракцией (явно формируйте список строк и соединяйте их при необходимости), но нет ничего плохого в подходе "строкового ввода-вывода" с немного более высокой абстракцией либо.
(Третий подход, который кажется немного не в фаворе, состоит в том, чтобы оставить extend
символов array.array
, только для того, чтобы перечислить их; -).