覆盖Python的print语句的换行生成行为
问题内容:
我有一堆用于编码原始电子邮件的旧代码,其中包含许多打印语句,例如
print >>f, "Content-Type: text/plain"
对于电子邮件来说,这一切都很好,但是现在我们利用相同的代码来输出HTTP请求。问题是Python打印语句'\n'
在HTTP需要时输出'\r\n'
。
看起来Python(至少是2.6.4)PRINT_NEWLINE
为print语句生成了尾部字节码,该语句被实现为
ceval.c:1582: err = PyFile_WriteString("\n", w);
因此,似乎没有简单的方法可以覆盖默认的换行行为。我考虑了以下解决方案
- 写入输出后,只需执行一个即可
.replace('\n', '\r\n')
。这将干扰使用多部分编码的HTTP消息。 -
在目标文件对象周围创建包装器并代理该
.write
方法def write(self, data):
if data == ‘\n’:
data = ‘\r\n’
return self._file.write(data) -
写的正则表达式转换
print >>f, text
到f.write(text + line_end)
哪里line_end
可以'\n'
或'\r\n'
。
我相信第三种选择是最合适的。听到您的Pythonic解决问题的方法会很有趣。
问题答案:
您现在应该通过定义新的输出函数来永远解决问题。如果打印了一个功能,这会容易得多。
我建议编写一个新的输出函数,尽可能地模仿现代打印函数的签名(因为重用一个好的接口是好的),例如:
def output(*items, end="\n", file=sys.stdout):
pass
更换所有有问题的打印后,您将不再有此问题-您可以随时更改函数的行为!这是为什么在Python 3中将print设置为函数的一个重要原因-因为在Python
2.x中,“所有”项目总是经过所有print
语句不再灵活且没有简单出路的阶段。