python3 печатать в строку

Используя Python 3, у меня есть консольное приложение, которое я переношу в графический интерфейс. В коде есть набор операторов печати, что-то вроде этого:

print(f1(), f2(), f3(), sep=getsep(), end=getend())

Я хотел бы преобразовать эти вызовы во что-то вроде:

GuiPrintLine(f1(), f2(), f3(), sep=getsep(), end=getend())

где каждая строка в конечном итоге отображается с использованием некоторой (неопределенной) структуры графического интерфейса.

Это легко сделать, если я могу преобразовать аргументы для печати в строку, которую print обычно выдает без побочного эффекта фактической печати в sysout. Другими словами, мне нужна такая функция:

s = print_to_string(*args, **kwargs)

Как отформатировать набор параметров для print(...) в одну строку, которая выдает тот же вывод, что и print()?

Я понимаю, что могу эмулировать печать, объединяя все аргументы с sep и end, но я бы предпочел использовать встроенное решение, если оно есть.

Использование печати и перенаправления sysout нецелесообразно, так как требует изменения глобального состояния приложения, а sysout может одновременно использоваться для другой диагностики.

Кажется, в Python это должно быть тривиально, так что, возможно, я просто упускаю что-то очевидное.

Спасибо за любую помощь!


person Brad    schedule 03.10.2016    source источник
comment
Я не совсем уверен, что понимаю на 100%, но ''.join(args) достигает ли того, что вам нужно?   -  person DaveBensonPhillips    schedule 03.10.2016
comment
Вроде того, но я не хочу ничего предполагать о содержании или существовании sep/end. Я думал, что что-то вроде этого может работать: kwargs['sep'].join(*args, kwargs[end]), но это сложно из-за возможного отсутствия sep/end.   -  person Brad    schedule 03.10.2016
comment
В чем разница между print и GuiPrintLine?   -  person baranskistad    schedule 03.10.2016
comment
sep.join(args) + end кажется лучшим решением.   -  person Rockybilly    schedule 03.10.2016
comment
@bjskistad - GuiPrintLine фактически не выводит текст в sysout. Он отображает его графически каким-то (неопределенным) способом - используя tkinter, pygame, что угодно...   -  person Brad    schedule 03.10.2016
comment
Отвечающему довольно сложно ответить на вопрос, если он/она точно не знает, что вы хотите, чтобы GuiPrintLine сделал. Вы хотите, чтобы он создал приложение curses? Создать HTTP-сервер и распечатать HTML?   -  person baranskistad    schedule 03.10.2016
comment
@bjskistad - мне не нужна помощь с окончательным выводом строки. Я уже знаю, как обращаться с этой частью. Мой вопрос полностью связан с получением ряда аргументов, которые обычно отправляются на печать в виде одной строки.   -  person Brad    schedule 03.10.2016
comment
Итак, вы хотите, чтобы они были отформатированы как отдельные строки?   -  person baranskistad    schedule 03.10.2016
comment
Я предполагаю, что это неясно, что вы пытаетесь здесь сделать, если говорите, что на самом деле вам не нужен вывод, который будет производить печать?   -  person pvg    schedule 03.10.2016
comment
@pvg - мне нужен именно тот вывод, который будет выдан print, но в виде строки, а не в виде вывода на стандартный вывод.   -  person Brad    schedule 03.10.2016
comment
Ах я вижу. StringIO - это то, что вам нужно.   -  person pvg    schedule 03.10.2016


Ответы (1)


Нашел ответ через строку io. При этом мне не нужно эмулировать обработку Print sep/end или даже проверять существование.

import io

def print_to_string(*args, **kwargs):
    output = io.StringIO()
    print(*args, file=output, **kwargs)
    contents = output.getvalue()
    output.close()
    return contents
person Brad    schedule 03.10.2016
comment
Я как раз собирался это предложить. Вы можете очистить объект StringIO для повторного использования с помощью методов .seek(0) и .truncate(). - person Terry Jan Reedy; 03.10.2016
comment
Если я не ошибаюсь, это добавит новую строку в конец строки; во избежание этого параметр end следует перенаправить на print. - person entonio; 11.07.2020
comment
@entonio, я полагаю, что конец перенаправляется на печать через **kwargs, не так ли? - person Brad; 21.05.2021