Pourquoi utiliser from __future__ import print_function interrompt l'impression de style Python2? [fermé]

135

Je suis nouveau en programmation avec python et j'essaie d'imprimer avec un séparateur et une fin, mais cela me donne toujours une erreur de syntaxe.

J'utilise python 2.7.

Voici mon code:

from __future__ import print_function
import sys, os, time

for x in range(0,10):
    print x, sep=' ', end=''
    time.sleep(1)

Et voici l'erreur:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$
UHMIS
la source
4
Vous avez importé l'impression en tant que fonction, mais vous la traitez toujours comme une instruction .
jonrsharpe
4
vous ne pouvez pas appeler print sans les parenthèses car vous avez changé print pour être une fonction print (args)
Charlie Parker

Réponses:

210

Tout d'abord, from __future__ import print_functiondoit être la première ligne de code de votre script (à part quelques exceptions mentionnées ci-dessous). Deuxièmement, comme d'autres réponses l'ont dit, vous devez printmaintenant utiliser comme fonction. C'est tout l'intérêt de from __future__ import print_function; pour amener la print fonction de Python 3 dans Python 2.6+.

from __future__ import print_function

import sys, os, time

for x in range(0,10):
    print(x, sep=' ', end='')  # No need for sep here, but okay :)
    time.sleep(1)

__future__Les instructions doivent être proches du début du fichier car elles changent des choses fondamentales sur le langage, et le compilateur doit donc les connaître depuis le début. De la documentation :

Une déclaration future est reconnue et traitée spécialement au moment de la compilation: les modifications de la sémantique des constructions de base sont souvent implémentées en générant un code différent. Il se peut même qu'une nouvelle fonctionnalité introduise une nouvelle syntaxe incompatible (comme un nouveau mot réservé), auquel cas le compilateur peut avoir besoin d'analyser le module différemment. De telles décisions ne peuvent pas être repoussées avant l'exécution.

La documentation mentionne également que les seules choses qui peuvent précéder une __future__instruction sont le module docstring, les commentaires, les lignes vides et d'autres instructions futures.

Cyphase
la source
1
First of all, from __future__ import print_function needs to be the first line of code in your script , Puis-je savoir pourquoi?
Avinash Raj
1
@UHMIS, faites end=' '.
Cyphase
14
Comme indiqué dans la documentation ( docs.python.org/2/reference/simple_stmts.html#future ), il ne doit pas s'agir de la première ligne: A future statement must appear near the top of the module. The only lines that can appear before a future statement are: the module docstring (if any), comments, blank lines, and other future statements.
ngulam
1
@ngulam, j'ai édité pour mentionner cela, mais ce n'était pas clair dans le premier paragraphe, alors j'ai corrigé cela. Merci de l'avoir signalé.
Cyphase
1
@AvinashRaj, je ne sais pas; vous devrez demander à UHMIS. Mais comme je l'ai dit dans un commentaire à votre réponse, OP a peut-être apporté un changement et ne l'a pas mentionné. Et le premier commentaire d'OP était qu'il y avait encore une erreur.
Cyphase