来源:Python 猫  作者:豌豆花下猫

[译] PEP 3105--改 print 为函数

PEP原文 : https://www.python.org/dev/peps/pep-3105

PEP标题: Make print a function

PEP作者: Georg Brandl

创建日期: 2006-11-19

合入版本: 3.0

译者 :豌豆花下猫(Python猫 公众号作者)

翻译计划 :https://github.com/chinesehuazhou/peps-cn

摘要

标题已说明了一切——本 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 语句,还需要持续不断地努力。

参考资料

[1]http://legacy.python.org/doc/essays/ppt/regrets/PythonRegrets.pdf

[2]Python 3.0 替换 print(Guido van Rossum)

https://mail.python.org/pipermail/python-dev/2005-September/056154.html

[3] py3k 中 print() 的参数(Guido van Rossum)

https://mail.python.org/pipermail/python-3000/2006-November/004485.html

版权

本文档已经放置在公共领域。源文档:

https://github.com/python/peps/blob/master/pep-3105.txt

推荐阅读:(点击下方标题即可跳转)

腾讯AI大战王者荣耀!504场1v1仅输1场,5v5达电竞职业水平

没看完这11 条,别说你精通 Python 装饰器

别再说学习无趣了,跟你分享这 8 条 Python 奇技淫巧

⬆️长按 2 秒关注「 小詹学Python 」

为什么 Python 3 把 print 改为函数?相关推荐

  1. Python入门之print()函数中sep和end的用法

    一.print()函数 用于打印输出 刚刚做了一个作业,比如说,你要用print语句输入这样的内容 要求是, 1.向外界获取生日的人的名字 2.定义一个变量name存储这个名字 3.最后得出,&quo ...

  2. Python中的print()函数

    print()函数可以直接使用,可以将你想展示的东西在IDLE或标准的控制台上显示. # 可以输出数字 print(54) print(98.4)# 可以输出字符串 print('hello worl ...

  3. Python字符串格式化,%和format函数

    Python字符串格式化 格式化的操作有两种 一.使用%,常用的格式化 格式 描述 %s 字符串 %d 有符号整数(十进制) %f 浮点数 %O 转换为带符号的八进制形式的整数 %X 转换为带符号的十 ...

  4. 简单介绍python的input,print,eval函数

    这篇文章主要为大家概述了python的input,print,eval函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助 input()函数 input()函数可以通过控制台 ...

  5. print函数python_带有结束参数的Python print()函数

    print函数python print()函数 (print() function) print() function is used to print message on the screen. ...

  6. python语言中print函数的作用_python中如何使用print函数

    Python中print语句 1.逗号分隔符 在Python中print语句可根据sys.stdout中包含的文件生成输出,它接受一个逗号分隔的对象表,如下实例:x = 1 y = 2 z = 3 p ...

  7. 笨方法“学习python笔记之print()函数end

    在<"笨方法"学习python>中的第7个习题中的用例代码中有print()函数的end用例 代码如下: end1 = "C" end2 = &qu ...

  8. python print()函数控制输出格式

    python 控制输出格式 [函数介绍] [print()函数] [format()函数] [格式化输出实例] 在这里总结一些python使用print()函数输出时控制格式的一些方法. [函数介绍] ...

  9. Python中的print函数及其中单引号双引号区别

    一,Python中的print函数 Python中print函数用法: print("hello world!") hello world! print(5+8) 13 print ...

最新文章

  1. tomcat上传war包失败
  2. python列表按照批次分配数据(亲测)
  3. 【Java并发编程】并发之痛 Thread,Goroutine,Actor
  4. 中小企业项目的痛VS感人IT团队
  5. truncate,delete,drop之间的区别
  6. 第10 章继承映射(InheritanceMappings)
  7. Redis - 数据持久化
  8. ViewController的view的创建
  9. 十本数据结构与算法书籍推荐
  10. Python机器学习之决策树(使用西瓜数据集构建决策树,并将其可视化,graphviz程序下载)
  11. PCI Express Capability Structure
  12. 攻防演练中防守方的防护措施.
  13. trainning-----1
  14. sql server 数据库表中插入带有英文 单引号 或双引号 的数据
  15. 06- 移动端APP兼容性测试以及APP兼容性测试手机选择与云测试技术
  16. 学习python的难点
  17. .[转] 全球最值得听的100首英文歌
  18. 服务端mysql数据存储设计_服务端开发指南与最佳实战 | 数据存储技术 | MySQL(03) 如何设计索引...
  19. 虚拟机不能识别本地镜像
  20. 机器学习基础算法(2)

热门文章

  1. sublime text 3 中的php代码语法检测
  2. PHP操作使用Redis
  3. 7000p壁纸怎么换_这些圣诞壁纸,劝你们马上点开,保存!真的超好看
  4. completablefuture 线程池_SpringBoot中如何优雅的使用多线程
  5. java字节数_Java各种类型占用的字节数
  6. php mysql三级联动,PHP+mysql实现的三级联动菜单功能示例
  7. copy所有的java文件到硬盘_将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad...
  8. html中的高和宽背景色怎么写,css background-size与背景图片填满div
  9. 【Nginx】浏览器请求URL遇到错误:no-referrer-when-downgrade
  10. 【Apache】 alias+proxy 将资源路径指向某个本地目录