别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

  • Sockets编程

  • Django

  • stackoverflow

  • Flask

  • 全栈之路

  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

    • PEP 中文翻译计划
    • [译] PEP-8 -- 编码风格指南中文版✨✨
    • [译] PEP202--列表推导式
    • [译] PEP 255--简单的生成器
    • [译] PEP 285--添加一种布尔类型
    • [译] PEP 318--函数和方法的装饰器
    • [译] PEP 328--导入多行及绝对/相对
    • [译]pep 333 -- Python Web 服务器网关接口 v1.0
    • [译]PEP 342--增强型生成器——协程
    • [译]PEP 380--子生成器的语法
    • [译]PEP 484 -- 类型提示
    • [译] PEP 525--异步生成器
    • [译] PEP 530--异步推导式
    • [译] PEP614--放宽对装饰器的语法限制
    • [译] PEP-312--Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
    • [译]PEP 3099--Python 3 中不会改变的事情
    • [译] PEP 3105--改 print 为函数
      • 摘要
      • 原理阐述
      • 设计规格
      • 向后兼容性
      • 实现
      • 参考资料
      • 版权
    • [译]PEP 3107 -- 函数注解
    • [译]PEP-3129 类装饰器
    • [译] PEP 3155--类和方法的特定名称
    • [译]pep 3333 -- Python Web 服务器网关接口 v1.0.1
  • Python工匠系列

  • 高阶知识点

  • Python 学习资源待整理
  • 设计模式

  • 好“艹蛋”的 Python 呀!
  • FIFO | 待学清单📝
  • pip 安装及使用
  • 数据分析

  • 源码阅读计划

  • OOP

  • 关于 python 中的 setup.py
  • 并行分布式框架 Celery
  • 七种武器,让你的代码提高可维护性
  • 使用 pdb 调试 Python 代码
  • 每周一个 Python 标准库
  • 🐍Python
  • PEP
佚名
2019-11-27
目录

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

PEP 原文 : https://www.python.org/dev/peps/pep-3105/ (opens new window)

PEP 标题: Make print a function

PEP 作者: Georg Brandl

创建日期: 2006-11-19

合入版本: 3.0

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

PEP 翻译计划 :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)
1

调用像:

print(a, b, c, file=sys.stderr)
1

相当于当前的:

print >>sys.stderr, a, b, c
1

可选的 sep 与 end 参数相应地指定了每个打印参数之间及之后的内容。

softspace 功能(当前在文件上的半秘密属性,用于告诉 print 是否要在第一个条目前插入空格)会被删除。因此,当前版本的以下写法不能被直接转换:

print "a",
print
1
2

它不会在“a”与换行符之间打印一个空格。

(译注:在 3.3 版本,print() 函数又做了改动,增加了默认参数 flush=False)

# 向后兼容性

本 PEP 中提出的改动将致使如今的 print 语句失效。只有那些恰好用括号包围了所有参数的写法才能在 Python 3 版本中生效,至于其它,只有加上了括号的值才能保持原样打印。例如,在 2.x 中:

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
('Hello', 'world')
1
2
3
4

而在 3.0 中:

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
Hello world
1
2
3
4

幸运的是,因为 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 (opens new window)

编辑 (opens new window)
#peps
上次更新: 2024-07-15, 08:03:22
[译]PEP 3099--Python 3 中不会改变的事情
[译]PEP 3107 -- 函数注解

← [译]PEP 3099--Python 3 中不会改变的事情 [译]PEP 3107 -- 函数注解→

最近更新
01
提升沟通亲和力的实用策略
03-26
02
工作
07-15
03
如何选房子
06-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式