为什么我们在导入print_function后调用print(在Python 2.6中)

时间:2010-12-30 07:24:22

标签: python import

要获得3.0打印功能,我们在Python 2.6中执行以下操作:

from __future__ import print_function

但是要使用我们调用print()的函数而不是print_function()。这只是一个不一致还是有充分的理由呢?

为什么不以下:

from __future__ import print

6 个答案:

答案 0 :(得分:47)

原因是当您从__future__导入时,您实际上只是设置一个标志,告诉解释器的行为与平时略有不同 - 在print_function的情况下,{{ 1}}函数可用于代替语句。 print()模块因此是“特殊的”或“魔术” - 它不像通常的模块那样工作。

答案 1 :(得分:11)

print_function FeatureName不会与print内置函数本身混淆。 它是未来可用的功能,因此您可以使用它可以提供的内置功能。<​​/ p>

其他功能包括:

all_feature_names = [
    "nested_scopes",
    "generators",
    "division",
    "absolute_import",
    "with_statement",
    "print_function",
    "unicode_literals",
]

有一些特定的原因,当您将代码迁移到下一个更高版本时,您的程序将保持使用更新的功能而不是__future__版本。此外,如果它是函数名称或关键字本身,它可能会导致解析器混淆。

答案 2 :(得分:4)

在Python 3中,关键字print已从调用语句更改为调用函数。

因此,您现在需要说print value,而不是说print(value),或者您将获得SyntaxError

通过执行import,此更改也在Python 2中实现,因此您可以使用与Python 3相同的语法编写程序(至少就print而言)。< / p>

答案 3 :(得分:4)

简单。 print是Python 2中的关键字。

所以像

这样的陈述
from somewhere import print

将是Python 2中的自动语法错误。

允许(在语法中对其进行硬编码)

from __future__ import print

被认为不值得。

答案 4 :(得分:0)

最小例子

>>> print     # Statement.

>>> from __future__ import print_function
>>> print     # Function object.
<built-in function print>
>>> print()   # Function call.

>>>

如上所述:What is __future__ in Python used for and how/when to use it, and how it works from __future__是改变Python解析代码方式的魔术语句。

from __future__ import print_function特别将print从语句更改为内置函数,如上面的交互式shell所示。

为什么print(1)在Python 2中没有from __future__ import print_function的情况下工作

因为:

print(1)

被解析为:

print (1)
^^^^^ ^^^
1     2
  1. print声明
  2. 参数
  3. 而不是:

    print( 1 )
    ^^^^^^ ^ ^
    1      2 1
    
    1. print()功能
    2. 参数
    3. assert 1 == (1)
      

      如上所述:Python tuple trailing comma syntax rule

答案 5 :(得分:0)

为完整起见,当前所有available功能都是:

+------------------+-------------+--------------+----------------------------------------------------+
|     feature      | optional in | mandatory in |                       effect                       |
+------------------+-------------+--------------+----------------------------------------------------+
| nested_scopes    | 2.1.0b1     |          2.2 | PEP 227: Statically Nested Scopes                  |
| generators       | 2.2.0a1     |          2.3 | PEP 255: Simple Generators                         |
| division         | 2.2.0a2     |          3.0 | PEP 238: Changing the Division Operator            |
| absolute_import  | 2.5.0a1     |          3.0 | PEP 328: Imports: Multi-Line and Absolute/Relative |
| with_statement   | 2.5.0a1     |          2.6 | PEP 343: The “with” Statement                      |
| print_function   | 2.6.0a2     |          3.0 | PEP 3105: Make print a function                    |
| unicode_literals | 2.6.0a2     |          3.0 | PEP 3112: Bytes literals in Python 3000            |
| generator_stop   | 3.5.0b1     |          3.7 | PEP 479: StopIteration handling inside generators  |
| annotations      | 3.7.0b1     |          4.0 | PEP 563: Postponed evaluation of annotations       |
+------------------+-------------+--------------+----------------------------------------------------+