为什么/如何内置Python的打印允许">>"运算符?

sco*_*awg 1 python operator-overloading operators built-in

我四处搜索,无法在这个网站或其他地方找到答案(总是挑战搜索涉及标点符号的主题).

我正在查找StringIOPython标准库(这里),其中一个例子就是这个(摘录):

import StringIO

output = StringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'  # <-- This is the line I'm asking about
Run Code Online (Sandbox Code Playgroud)

>>操作员如何或为何在这里工作?据我所知(我不是Python专家),这是正确的移位运算符.我想也许是StringIO覆盖__rshift__什么的,但是StringIO的来源并没有背叛任何这样的东西.

我还没有去看看print内置是如何实现的,但是通过初始搜索,我无法弄清楚它是如何工作的.任何人?

aba*_*ert 5

这真的是一个问题.


首先,"如何"问题:

>>令牌实际上不是这里的经营者; 它的语法部分print语句,记录在这里.语法是:

print_stmt ::=  "print" ([expression ("," expression)* [","]]
                | ">>" expression [("," expression)+ [","]])
Run Code Online (Sandbox Code Playgroud)

......语义是:

这种形式有时被称为"打印V形."在这种形式中,>>必须在"文件类"对象之后的第一个表达式,特别是具有上述write()方法的对象.使用此扩展表单,后续表达式将打印到此文件对象.


第二,"为什么"的问题:

早期,Python开发人员认为这是一种编写文件的便捷方式.

从那以后,他们添加了stdout重定向,以及更强大的文件和字符串格式化API,因此它不再那么有用了.而且,由于其他现代功能,如关键字参数,以及几十年的思考,他们提出了一种更灵活的方式来设计print为常规功能,根本不需要任何特殊语法.但是删除它会破坏向后兼容性,所以直到3.0才能删除它.

它在3.0中删除; 你只是在看它,因为你使用的是旧版本.

print但是,如果您想要2.7中的新功能,可以使用以后的语句:from __future__ import print_function.但那当然会破裂print >>foo, spam; 你必须把它重写为print(spam, file=foo).