【问题标题】:How to import the most recent version of the print function in Python 2.7.x?如何在 Python 2.7.x 中导入最新版本的打印功能?
【发布时间】:2017-01-04 19:09:04
【问题描述】:

我发现如果我使用 Python 2.7.11,我无法在新的打印函数中使用 flush 参数。我用过:

from __future__ import print_function

print('Hello', flush=True)

但它抱怨错误:

Traceback (most recent call last):
  File "print_future.py", line 3, in <module>
    print('Hello', flush=True)
TypeError: 'flush' is an invalid keyword argument for this function

查看the documentation for print 后,我发现它不起作用,即使它是一个参数。我的推断是它不起作用,因为 flush 仅在 3.3 版本中添加,因此特殊的 from __future__ import 语句可能正在导入旧版本的函数。 cmets 建议它使用 2.7.11,但我不明白它为什么这样做。

我确实看到了Need Python 3.4 version of print() from __future__,其答案只是包装了print 并手动添加了flush 参数。尽管这样可行,但我们没有最新版本的印刷品,这似乎更像是一种黑客攻击而不是解决真正的问题。

有没有办法将特定版本的 Python 函数(我想使用 Python 3.5 print 函数)导入我当前的 Python 脚本?如果这不可能,为什么不呢?


即使我写了我的问题,人们似乎(令人惊讶地)也不清楚我的问题有何不同。我会说不同的。

  1. 看来我的问题是它导入了我不期望的python 函数(因为它没有找到flush 参数)。因此,最自然也是我想做和知道的第一件事是,它导入了哪个打印函数。 cmets 建议它使用 2.7.11,但我不明白它为什么这样做。
  2. 我了解 from future 语句改变了我的编译器的工作方式。似乎我认为,由于它是一个未来的声明,它还从未来的版本中引入了打印功能。似乎它只会改变我的解释器的行为。如果我能够看到它使用的是什么打印函数,我就会知道它不是从未来版本中导入函数,而只是像未来的 python 解释器一样工作。看起来就是这样,但我不确定,我想确切地知道发生了什么。
  3. 最后但同样重要的是,是否有一种自然的方式可以将未来的 python 函数导入到我当前的 python 脚本中?我想使用 python 3.5 print 语句,除了让编译器表现得像未来的 python 解释器外,还不能像未来的 python 版本一样使用该函数吗? (至少对我而言)让解析器表现得像未来的 python 但仍然像 2.7.11 一样行事是违反直觉的。我想要的解决方案不是包装器,而是最近 python 的导入。如果这是不可能的,那么我的问题的答案应该解释为什么它不可能。

【问题讨论】:

  • 当你from future import print_function你得到2.7.11版本的打印功能。它不读取任何 python3 代码;它没有从任何 python 3 获得版本。您无法将内置的 python3 print 导入 python2。如果您需要“刷新”,唯一正确的解决方案是使用包装器:因此是重复的。
  • 你又问了同样的问题,你已经链接了它的事实并没有太大的区别。如果这就是答案,那就是答案;如果您不明白原因,请考虑发表评论,如果您需要其他评论,请考虑赏金。
  • @jonrsharpe 我没有问同样的问题。我什至写了有什么区别。首先,我已经说过带有包装器的解决方案不能解决我的问题。我的问题是从 python 3.4 或更高版本中导入 print 语句。我知道未来的声明只是改变了我的 python 在编译时解析我的文件的方式,但是有没有办法让它使用我请求的打印功能?我还问我如何检查它使用的打印功能的版本,我想知道并检查一下。如果答案是即使你使用未来你也不能用包装器来做,我会..
  • @jonrsharpe 我可以描述我认为的答案。在我的回答规范中,包装器是一种黑客行为。它可能不在任何其他上下文中,但在这个问题中它不是解决方案,因为它没有向我解释我想知道的内容。我已经用更多细节更新了我的问题。希望它能澄清我想问的问题。说“在你的约束下不可能做到这一点”是一个完全可以接受的答案。我也澄清了我所说的未来是什么意思。我错了很好,但我只是想知道为什么我不能按照我要求的方式去做。
  • 您为什么不直接阅读actually correspond to what you're using 的文档?他们清楚地表明没有flushfrom __future__ import 不会在您的整个机器上搜索替代实现,而且您根本不清楚为什么您会认为它会,它使用与您正在使用的 Python 版本捆绑在一起的特定版本(否则它不会如果您还没有安装 3.x,则根本无法工作)。如果你想要 3.5 的 print,或者其他新功能,只需使用 3.5,几乎没有理由仍然使用 2.x。

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


【解决方案1】:
  1. 它导入了我没想到的python函数

    我不明白为什么,这是printthat's documented in 2.7.x的版本。

    它正在导入哪个打印功能。

    与 2.7.11 捆绑的版本,即 3.0 中引入的版本(请参阅PEP-3105)。

    cmets 建议它使用 2.7.11,但我不明白它为什么这样做

    ...因为那是您使用的 Python 版本? from __future__ import ... 不会在您的计算机上搜索替代实现,它使用与您正在使用的 Python 版本捆绑在一起的实现。如果您考虑一下,这是不可避免的,否则未来的导入将在未安装 3.x 的机器上失败。

  2. 其中大部分对我来说意义不大,但是:

    我认为由于它是一个未来的声明,它还从未来的版本中引入了打印功能。

    这就是它正在做的事情。不过,您无法选择哪个 未来版本。您将获得在添加到 __future__ 时计划发布的版本。

  3. 有没有一种自然的方法可以将未来的 python 函数导入我当前的 python 脚本?

    是的,这是您使用的方式,只要 __future__ 支持该功能。

    这个功能不能用吗

    不是您正在使用的 Python 版本中的 3.3 及更高版本,不是*。如果您想要更新版本的 Python 提供的功能,使用更新版本的 Python。 2.x 已经没路了。

    (至少对我而言)让解析器表现得像未来的 python 但仍然像 2.7.11 一样是反直觉的

    这不是 “[代理] 像 2.7.11”。它使用 3.x 中的 print 函数,而不是 2.x 中的 print 语句。如果您在导入print_function 后尝试print 'hello',您将获得SyntaxError,就像在3.x 中一样。

    * 假设您不打算入侵您的安装

【讨论】:

  • 当一个不知情的 python 用户(我或本例中的 OP)遇到from future import X 时,很自然的假设是你正在从一个版本中导入功能 other比您正在使用的那个 - 例如一个实际的未来版本(我想知道什么会给我们这个想法?)。我现在明白__future__ 确实是用词不当——也许__testing____planned__ 会更好。这不是一个神奇的关键字,而只是您的版本中包含的另一个包。您的回答包含正确的信息,但刻薄和傲慢并不真正属于 SO。
  • @argentum2f 这不仅仅是另一个包,它改变了解释器的工作方式
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多