要获得3.0打印功能,我们在Python 2.6中执行以下操作:
from __future__ import print_function
但是要使用我们调用print()的函数而不是print_function()。这只是一个不一致还是有充分的理由呢?
为什么不以下:
from __future__ import print
答案 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
print
声明而不是:
print( 1 )
^^^^^^ ^ ^
1 2 1
print()
功能和
assert 1 == (1)
答案 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 |
+------------------+-------------+--------------+----------------------------------------------------+