Pour obtenir la fonction d'impression 3.0, procédez comme suit dans Python 2.6:
from __future__ import print_function
Mais pour utiliser la fonction, nous appelons print () et non print_function (). Est-ce juste une incohérence ou y a-t-il une bonne raison à cela?
Pourquoi pas ce qui suit:
from __future__ import print
La raison en est que lorsque vous importez à partir de __future__
, vous définissez en réalité un indicateur qui indique à l'interprète de se comporter un peu différemment que d'habitude. Dans le cas de print_function
, la fonction print()
est rendue disponible à la place de l'instruction. Le module __future__
est donc "spécial" ou "magique" - il ne fonctionne pas comme les modules habituels.
print_function
est une FeatureName
et ne doit pas être confondu avec la fonction intégrée print
elle-même . Il s'agit d'une fonctionnalité disponible à partir du futur afin que vous puissiez utiliser la fonction intégrée qu'elle peut fournir.
Les autres caractéristiques comprennent:
all_feature_names = [
"nested_scopes",
"generators",
"division",
"absolute_import",
"with_statement",
"print_function",
"unicode_literals",
]
Il existe des raisons spécifiques: lorsque vous migrez votre code vers la prochaine version supérieure, votre programme restera tel qu’il utilisera la fonctionnalité mise à jour au lieu de la version __future__
. De plus, s'il s'agissait du nom de la fonction ou du mot clé lui-même, cela pourrait créer une confusion pour l'analyseur.
Simple. print est un mot-clé dans Python 2.
Donc, une déclaration comme
from somewhere import print
serait une syntaxe automatique dans Python 2.
Permettre (coder en dur dans la syntaxe)
from __future__ import print
a été jugé ne vaut pas l'effort.
En Python 3, le mot-clé print
a été changé: l'appel d'une instruction a été appelé une fonction.
Ainsi, au lieu de dire print value
, vous devez maintenant dire print(value)
ou vous obtiendrez une SyntaxError
.
En effectuant import
, cette modification est également effectuée dans Python 2 afin que vous puissiez écrire des programmes utilisant la même syntaxe que Python 3 (au moins en ce qui concerne print
.
Exemple minimal
>>> print # Statement.
>>> from __future__ import print_function
>>> print # Function object.
<built-in function print>
>>> print() # Function call.
>>>
Comme mentionné à: Qu'est-ce que __future__ en Python est utilisé et comment/quand l'utiliser, et comment cela fonctionne-t-il?from __future__
sont des instructions magiques qui modifient la façon dont Python analyse le code.
from __future__ import print_function
en particulier change print
d'une instruction en une fonction intégrée, comme indiqué dans le shell interactif ci-dessus.
Pourquoi print(1)
fonctionne sans from __future__ import print_function
en Python 2
Parce que le:
print(1)
est analysé comme:
print (1)
^^^^^ ^^^
1 2
print
statementau lieu de:
print( 1 )
^^^^^^ ^ ^
1 2 1
print()
functionEt:
assert 1 == (1)
comme mentionné à: règle de syntaxe de virgule de fin de tuple Python
Pour être complet, toutes les fonctionnalités actuellement disponibles sont les suivantes:
+------------------+-------------+--------------+----------------------------------------------------+
| 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 |
+------------------+-------------+--------------+----------------------------------------------------+