【问题标题】:Need Python 3.4 version of print() from __future__需要来自 __future__ 的 Python 3.4 版本的 print()
【发布时间】:2015-03-15 11:59:27
【问题描述】:

目前,当我

from __future__ import print_function

从 Python 2.7.6 开始,我显然在添加 flush 关键字参数之前获得了 print() 版本,根据 docs 在 Python 3.3 中加入了该参数。我的系统(Ubuntu)中安装的 Python3 是 Python 3.4,我验证了它的 print() 函数有 flush 参数。

如何从 3.4 导入 print() 函数? __future__从哪里获得旧的打印功能?

【问题讨论】:

  • 你刚才不是用flush参数导入打印函数吗?
  • 你怎么知道它试图从 3.4 导入函数?

标签: python python-2.7 python-3.x printing flush


【解决方案1】:

您无法将 3.4 的版本导入 Python 2.7,不。打印后手动刷新sys.stdout

import sys

print(...)
sys.stdout.flush()

或者,如果您必须有一些接受关键字参数的东西,您可以围绕 print() 创建一个包装函数:

from __future__ import print_function
import sys
try:
    # Python 3
    import builtins
except ImportError:
    # Python 2
    import __builtin__ as builtins


def print(*args, **kwargs):
    sep, end = kwargs.pop('sep', ' '), kwargs.pop('end', '\n')
    file, flush = kwargs.pop('file', sys.stdout), kwargs.pop('flush', False)
    if kwargs:
        raise TypeError('print() got an unexpected keyword argument {!r}'.format(next(iter(kwargs))))
    builtins.print(*args, sep=sep, end=end, file=file)
    if flush:
        file.flush()

这将创建一个替换版本,该版本与 3.3 及更高版本中的版本相同。

【讨论】:

  • 很好的解决方法;我猜__future__ 的东西是用那个版本的 Python 2.x 打包的吗?
  • __future__ 导入更改语法解析。这会禁用将print 识别为关键字。这允许正常访问始终存在但通常通过将 print 识别为关键字来掩盖的内置 print() 函数。如果没有 __future__ 导入,可以使用 import __builtin__ as b; b.__dict__['print'] 访问它。
  • @Pete:确实,我说得不够精确。 from __future__ 导入是语法标志;解析器和编译器改变行为。 print() 函数只是 Python 2 中的内置函数,但您通常不能使用它,因为 print 是保留关键字和语句。通过导入,编译器会删除该关键字保留和语句。
  • 为什么不能从 3.4 导入?
  • @CharlieParker: __future__ 进口实际上并不进口任何通常意义上的东西。执行from __future__ import print_function 就像告诉Python 2.7“我想以不同的方式使用print”。它实际上并没有从 Python 3 加载任何代码。它只是告诉 Python 2.7 使用已经内置于 Python 2.7 中的不同“模式”。
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2020-06-21
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多