共计 1615 个字符,预计需要花费 5 分钟才能阅读完成。
摘要
题目已阐明了所有——本 PEP 提议应用新的内置函数 print() 来代替 print 语句,并倡议给此新函数应用非凡的签名(signature)。
原理论述
print 语句 早就被列在了不牢靠的语言个性列表中,例如 Guido 的“Python 之悔”(Python Regrets)演讲【1】,并打算在 Python 3000 版本移除。因而,本 PEP 的目标并不陈腐,只管它可能会在 Python 开发人员中引起较大争议。
以下对 print() 函数的争议是提取自 Guido 自己的 Python-3000 音讯【2】:
- print 是惟一的应用程序级性能,并领有专属的语句。在 Python 的世界里,当某些工作在不通过编译器的帮忙就无奈实现的状况下,语法(syntax)通常会被用作最初的伎俩。在这种异常情况下,print 并不适合。
- 在开发应用程序的时候,人们常常须要用更简单的货色来代替 print 输入,例如调用 logging,或者调用其它的 I/O 库。至于 print() 函数,这是个含糊其辞的字符替换,现在它混搭了所有那些括号,还可能会转换 >>stream 款式的语法。
- 为 print 设置非凡的语法只会给进化带来一个更加微小的屏障,例如这有个猜测,一个新的 printf() 函数不必多久就会呈现,跟 print() 函数共存。
- 当须要一个不同的分隔符(不是空格,或者没有分隔符)时,没有简略的办法能够将 print 语句转换成另一个调用。同样地,应用其它一些分隔符而非空格时,根本无法不便地打印对象。
- 如果 print() 是个函数,就能够非常容易地在一个模块内替换它(仅需 def print(*args):…),甚至能够在整个程序内替换(例如放一个不同的办法进 __builtin__.print)。实际上,要做到这点,还能够写一个带 write() 办法的类,而后定向给 sys.stdout,这想法不错,但无疑是一个十分微小的概念飞跃,而且跟 print 相比,它工作在不同的层级。
设计规格
print() 的书写形式取自各种邮件,最近公布在 python-3000 列表里的是【3】:
def print(*args, sep='', end='\n', file=None)
调用像:
print(a, b, c, file=sys.stderr)
相当于以后的:
print >>sys.stderr, a, b, c
可选的 sep 与 end 参数相应地指定了每个打印参数之间及之后的内容。
softspace 性能(以后在文件上的半机密属性,用于通知 print 是否要在第一个条目前插入空格)会被删除。因而,以后版本的以下写法不能被间接转换:
print "a",
print
它不会在“a”与换行符之间打印一个空格。
(译注:在 3.3 版本,print() 函数又做了改变,减少了默认参数 flush=False)
向后兼容性
本 PEP 中提出的改变将以致现在的 print 语句生效。只有那些恰好用括号突围了所有参数的写法能力在 Python 3 版本中失效,至于其它,只有加上了括号的值能力放弃原样打印。例如,在 2.x 中:
>>> print ("Hello")
Hello
>>> print ("Hello", "world")
('Hello', 'world')
而在 3.0 中:
>>> print ("Hello")
Hello
>>> print ("Hello", "world")
Hello world
侥幸的是,因为 print 是 Python 2 中的一个语句,所以它能够被通过自动化工具而检测到,并牢靠而准确地替换掉,因而应该没有重大的移植问题(如果有人来写这个工具的话)。
实现
更改将在 Python 3000 分支中实现(修订版从 53685 到 53704)。大多数在维库代码(legacy code)曾经做转换了,但要抓出发行版本中的每个 print 语句,还须要继续一直地致力。
以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈,发送“J”即可收费获取,每日干货分享