使用 Python 3,我有一个控制台应用程序,我正在将其移植到 GUI。该代码有一堆打印语句,如下所示:
print(f1(), f2(), f3(), sep=getsep(), end=getend())
我想将这些调用转换为:
GuiPrintLine(f1(), f2(), f3(), sep=getsep(), end=getend())
每行最终都是使用一些(未定义的)GUI 框架渲染的。
如果我可以将 print 的参数转换为 print 通常生成的字符串,而不会产生实际打印到 sysout 的副作用,那么这很容易做到。换句话说,我需要一个这样的函数:
s = print_to_string(*args, **kwargs)
如何将 print(...) 的一组参数格式化为单个字符串,以产生与 print() 产生的输出相同的输出?
我意识到我可以通过将所有参数与 sep 和结尾连接起来来模拟打印,但我更愿意使用内置解决方案(如果有的话)。
使用打印和重定向 sysout 没有吸引力,因为它需要修改应用程序的全局状态,并且 sysout 可能同时用于其他诊断。
这在Python中似乎应该是微不足道的,所以也许我只是错过了一些明显的东西。
感谢您的帮助!
通过字符串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
我的解决方案:
def print_to_string(*args, **kwargs):
newstr = ""
for a in args:
newstr+=str(a)+' '
return newstr
只是为了通过上下文管理器提供 Brad 答案的更新版本,学分归他所有。
import io
def print_to_string(*args, **kwargs):
with io.StringIO as output:
print(*args, file=output, **kwargs)
return output.getvalue()