需要 Python 3.4 版本的 __future__ 中的 print()。

4

目前,当我使用Python 2.7.6时,我似乎得到的是在Python 3.3之前添加了flush关键字参数的print()版本,根据文档。我的系统(Ubuntu)安装了Python 3.4,并且我验证了它的print()函数具有flush参数。

如何从3.4中导入print()函数?__future__从哪里获取旧的print函数?


你是不是没有导入带有flush参数的print函数? - Charlie Parker
你是怎么知道它在尝试从3.4导入一个函数的? - Charlie Parker
1个回答

12

不能将3.4版本导入到Python 2.7中,不行。只需在打印后手动清空sys.stdout

你不能从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及以上版本的版本完全相同。


2
__future__ 导入会改变语法解析。这个导入禁用了 print 作为关键字的识别。这允许正常访问内置的 print() 函数,该函数始终存在,但通常被 print 关键字的识别所掩盖。如果没有 __future__ 导入,可以通过 import __builtin__ as b; b.__dict__['print'] 访问它。 - Terry Jan Reedy
2
@Pete:确实,我表达不够准确。from __future__导入是语法标志;解析器和编译器会改变行为。在Python 2中,print()函数只是一个内置函数,但通常无法使用它,因为print是保留关键字和语句。通过导入,编译器会删除该关键字保留和语句。 - Martijn Pieters
@MartijnPieters 我怎么知道我正在导入什么?我还有一个import future print语句,但它无法识别flush。 - Charlie Parker
@MartijnPieters,为什么它是在C代码中定义的C函数很重要呢?似乎无论如何我们都在导入和使用它。 - Charlie Parker
2
@CharlieParker:__future__ 导入实际上并不像通常意义上的导入任何东西。使用 from __future__ import print_function 就像告诉 Python 2.7:“我想要以不同的方式使用 print”。它实际上并没有从 Python 3 中加载任何代码,只是告诉 Python 2.7 使用已经内置在其中的不同“模式”。 - BrenBarn
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接