2016-10-03 3 views
0

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

print(' ', 'p', ' ', sep='', end='')

(В действительности позиционные параметры фактически возвращается из функций, и может быть больше или меньше, чем 3, как это:

print(f1(), f2(), f3(), sep='', end='')

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

GuiPrintLine(' ', 'p', ' ', sep='', end='')

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

Это легко сделать, если я могу преобразовать аргументы в строку. Я хотел бы, чтобы форматировать список параметров в виде одной строки, что печать будет нормально выход с чем-то вроде этого:

def GuiPrintLine(*args, **kwargs): 
    s = text.format(*args, **kwargs) 
    # ... then display the string on the gui ... 

Однако это требует формат строки (текст). Есть ли простой способ сделать это, который автоматически производит тот же вывод, что и функция печати? Я понимаю, что могу эмулировать печать, объединяя все аргументы с sep и концами, но я бы предпочел использовать встроенное решение, если оно есть.

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

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

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

+2

Я не совсем уверен, что понимаю 100%, но «.join (args)» достигает того, что вам нужно? – DaveBensonPhillips

+0

Сортировка, но я не хочу ничего говорить о содержании или существовании sep/end. Я думал, что что-то вроде этого может работать: '' 'kwargs ['sep']. Join (* args, kwargs [end])' '', но это осложняется рассмотрением возможного отсутствия sep/end. – Brad

+0

Какая разница между 'print' и' GuiPrintLine'? – baranskistad

ответ

1

Найден ответ через строку io. При этом мне не нужно подражать обработке Prints 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 
+1

Я как раз собирался это предложить. Вы можете очистить объект StringIO для повторного использования с помощью.seek (0) и .truncate(). –

+0

@TerryJanReedy - спасибо за подсказку! – Brad