返回介绍

版本独立的打印

发布于 2024-01-29 22:24:16 字数 2367 浏览 0 评论 0 收藏 0

最后,如果你没有限制在Python 3.0下工作,但仍然想要打印能够与Python 3.0兼容,还有一些选择。其中之一就是,可以编写Python 2.6的print语句并且使用Python 3.0的2to3转换脚本自动将它们转换为Python 3.0函数调用。参见Python 3.0的文档以更详细地了解这一脚本,它试图把Python 2.X代码转换为可在Python 3.0下运行。

此外,可以在Python 2.6代码中编写Python 3.0的print函数,通过像下面这样一条语句支持该函数调用的变体:

这条语句把Python 2.6修改为支持Python 3.0的print函数。通过这种方法,我们可以使用Python 3.0 print功能,并且如果随后迁移到Python 3.0的话不必修改print。

还要记住,简单的打印,就像表11-5的头两行那样,在两个Python版本中都有效,因为任何表达式都可以包含在圆括号中,我们总是可以在Python 2.6中通过添加外围的圆括号,来伪装成调用一个Python 3.0 print函数。这么做的唯一缺点是,如果有多个要打印对象的话,它会产生一个元组(超出了已打印的对象),因为它们会打印出额外的外围圆括号。例如,在Python 3.0中,调用的圆括号中可能列出任意多个对象:

第一个在Python 2.6中也同样地工作,但是,第二个会在输出中产生一个元组:

要真正做到可移植,可以把打印字符串格式化为一个单个的对象,使用字符串格式化表达式或方法调用,或者我们在第7章介绍的其他字符串工具:

当然,如果你专门地使用Python 3.0的话,可以完全忘记这一映射,但很多程序员不编写Python 2.X的代码和系统的话,至少会遇到它们。

注意:我在整本书中使用Python 3.0的print函数调用。我通常将会提醒你,该结果在Python 2.6下可能有额外的外围圆括号,因为多个项是一个元组,但我有时候不会提醒你,因此,请把这个提醒当作一个额外的警告——如果你在Python 2.6的打印文本中看到额外的圆括号的话,要么在print语句中删除圆括号,使用这里给出的版本独立方案重新编写打印代码;要么学习习惯多余的文本。

为什么要注意print和stdout

print语句和sys.stdout之间的等效是很重要的。这样才有可能把sys.stdout重新赋值给用户定义的对象(提供和文件相同的方法,就像write)。因为print语句只是传送文本给sys.stdout.write方法,可以把sys.stdout赋值给一个对象,而由该对象的write方法通过任意方式处理文字,通过这个对象捕捉程序中打印的文本。

例如,你可以传送打印的文字给GUI窗口,或者定义一个有write方法的对象,它会做所需要的发送工作,从而可以提供给多个目的地。本书后面介绍类的时候,你会看到这个技巧的例子,它基本上看起来如下面的代码段。

这样行得通是因为print是本书下一部分中的所谓的多态运算:sys.stdout是什么不重要,只要有个方法(接口)称为write即可。在Python 3.0中使用文件关键字参数以及在Python 2.6中使用print的扩展形式>>,这种对象的重定向甚至变得更简单,因为我们不再需要刻意重设sys.stdout——常规的print仍然定向到stdout流:

Python内置的raw_input()函数会从sys.stdin文件读入,所以你可以用类似方式拦截对读取的请求:使用类来实现类似文件的read方法。参考第10章中关于raw_input和while循环的例子。

注意:因为打印的文字进入stdout流,这也是在CGI脚本中打印HTML的方式。这也可以让你在操作系统命令行中对Python脚本的输入和输出进行像往常一样的重定向:

Python的打印操作重定向工具实质上是这些Shell语法形式的纯Python替代。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文