Warum unterbricht die Verwendung von __future__ import print_function den Druck im Python2-Stil? [geschlossen]

135

Ich bin neu in der Programmierung mit Python und versuche, mit einem Trennzeichen und einem Ende auszudrucken, aber es gibt mir immer noch einen Syntaxfehler.

Ich benutze Python 2.7.

Hier ist mein Code:

from __future__ import print_function
import sys, os, time

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

Und hier ist der Fehler:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$
UHMIS
quelle
4
Sie haben print als Funktion importiert, behandeln es aber immer noch als Anweisung .
Jonrsharpe
4
Sie können print nicht ohne die Klammer aufrufen, da Sie print in einen Funktionsdruck (args) geändert haben
Charlie Parker

Antworten:

210

Zunächst from __future__ import print_functionmuss die erste Codezeile in Ihrem Skript sein (abgesehen von einigen unten genannten Ausnahmen). Zweitens müssen Sie, wie andere Antworten bereits sagten, printjetzt als Funktion verwenden. Das ist der springende Punkt from __future__ import print_function; um die print Funktion von Python 3 in Python 2.6+ zu bringen.

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__Anweisungen müssen sich am Anfang der Datei befinden, da sie grundlegende Dinge in Bezug auf die Sprache ändern und der Compiler sie daher von Anfang an kennen muss. Aus der Dokumentation :

Eine zukünftige Anweisung wird speziell zur Kompilierungszeit erkannt und behandelt: Änderungen an der Semantik von Kernkonstrukten werden häufig durch Generieren unterschiedlichen Codes implementiert. Es kann sogar vorkommen, dass eine neue Funktion eine neue inkompatible Syntax einführt (z. B. ein neues reserviertes Wort). In diesem Fall muss der Compiler das Modul möglicherweise anders analysieren. Solche Entscheidungen können erst zur Laufzeit verschoben werden.

In der Dokumentation wird auch erwähnt, dass die einzigen Dinge, die einer __future__Anweisung vorausgehen können, die Modul-Dokumentzeichenfolge, Kommentare, Leerzeilen und andere zukünftige Anweisungen sind.

Cyphase
quelle
1
First of all, from __future__ import print_function needs to be the first line of code in your script Darf ich wissen warum?
Avinash Raj
1
@UHMIS, bitte end=' '.
Cyphase
14
Wie in der Dokumentation angegeben ( docs.python.org/2/reference/simple_stmts.html#future ), muss es nicht die erste Zeile sein: 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, ich habe es bearbeitet, um das zu erwähnen, aber es war im ersten Absatz nicht klar, also habe ich das behoben. Vielen Dank für den Hinweis.
Cyphase
1
@AvinashRaj, ich weiß es nicht; Sie müssten UHMIS fragen. Aber wie ich in einem Kommentar zu Ihrer Antwort sagte, hat OP vielleicht eine Änderung vorgenommen und sie nicht erwähnt. Und OPs erster Kommentar war, dass es immer noch einen Fehler gab.
Cyphase