Dlaczego użycie from __future__ import print_function przerywa drukowanie w stylu Python2? [Zamknięte]

140

Jestem nowy w programowaniu w Pythonie i próbuję wydrukować z separatorem i zakończyć, ale nadal powoduje to błąd składni.

Używam Pythona 2.7.

Oto mój kod:

from __future__ import print_function
import sys, os, time

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

A oto błąd:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$
UHMIS
źródło
4
Zaimportowałeś wydruk jako funkcję, ale nadal traktujesz go jako instrukcję .
jonrsharpe
4
nie możesz wywołać print bez nawiasów, ponieważ zmieniłeś print na funkcję print (argumenty)
Charlie Parker

Odpowiedzi:

214

Przede wszystkim from __future__ import print_functionmusi to być pierwsza linia kodu w skrypcie (poza kilkoma wyjątkami wymienionymi poniżej). Po drugie, jak powiedziały inne odpowiedzi, musisz printteraz użyć jako funkcji. O to chodzi w from __future__ import print_function; przenieść print funkcję z Pythona 3 do Pythona 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__Instrukcje muszą znajdować się blisko początku pliku, ponieważ zmieniają fundamentalne elementy języka, a więc kompilator musi wiedzieć o nich od samego początku. Z dokumentacji :

Przyszła instrukcja jest rozpoznawana i traktowana specjalnie w czasie kompilacji: zmiany semantyki konstrukcji rdzenia są często implementowane przez generowanie innego kodu. Może się nawet zdarzyć, że nowa funkcja wprowadza nową niekompatybilną składnię (na przykład nowe słowo zastrzeżone), w którym to przypadku kompilator może wymagać odmiennego przeanalizowania modułu. Takie decyzje nie mogą zostać odłożone do czasu uruchomienia.

Dokumentacja wspomina również, że jedyne rzeczy, które mogą poprzedzać __future__instrukcję, to dokumentacja modułu, komentarze, puste wiersze i inne przyszłe instrukcje.

Cyfaza
źródło
1
First of all, from __future__ import print_function needs to be the first line of code in your script , Czy mogę wiedzieć, dlaczego?
Avinash Raj
1
@UHMIS, zrób end=' '.
Cyphase
14
Jak stwierdził dokumentacja ( docs.python.org/2/reference/simple_stmts.html#future ) ma nie być pierwsza linia: 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, redagowałem, aby o tym wspomnieć, ale nie było to jasne w pierwszym akapicie, więc naprawiłem to. Dzięki za wskazanie tego.
Cyphase
1
@AvinashRaj, nie wiem; musiałbyś zapytać UHMIS. Ale jak powiedziałem w komentarzu do twojej odpowiedzi, być może OP dokonał zmiany i nie wspomniał o tym. Pierwszym komentarzem OP było stwierdzenie, że nadal występuje błąd.
Cyphase