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内置是如何实现的,但是通过初始搜索,我无法弄清楚它是如何工作的.任何人?
这真的是一个问题.
首先,"如何"问题:
该>>令牌实际上不是这里的经营者; 它的语法部分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).