web-dev-qa-db-fra.com

pourquoi invoquons-nous print après l'importation de print_function (en Python 2.6)

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
60
H2ONaCl

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.

47
kindall

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.

11
Senthil Kumaran

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.

4
Andreas Kostyrka

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.

4
Tim Pietzcker

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
  1. print statement
  2. argument

au lieu de:

print( 1 )
^^^^^^ ^ ^
1      2 1
  1. print() function
  2. argument

Et:

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       |
+------------------+-------------+--------------+----------------------------------------------------+
0
not2qubit