Почему использование from __future__ import print_function нарушает печать в стиле Python2? [закрыто]

135

Я новичок в программировании на python, и я пытаюсь распечатать с разделителем и концом, но это все еще дает мне синтаксическую ошибку.

Я использую Python 2.7.

Вот мой код:

from __future__ import print_function
import sys, os, time

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

И вот ошибка:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$
ЕИСЗ
источник
4
Вы импортировали печать как функцию, но по- прежнему рассматриваете ее как инструкцию .
jonrsharpe
4
вы не можете вызывать print без скобок, потому что вы изменили print на функцию print (args)
Чарли Паркер

Ответы:

210

Прежде всего, это from __future__ import print_functionдолжна быть первая строка кода в вашем скрипте (за исключением некоторых исключений, упомянутых ниже). Во-вторых, как говорили другие ответы, теперь вы должны использовать printкак функцию. В этом весь смысл from __future__ import print_function; чтобы перенести print функцию из Python 3 в 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__операторы должны быть в верхней части файла, потому что они меняют фундаментальные вещи в языке, и поэтому компилятор должен знать о них с самого начала. Из документации :

Будущее утверждение распознается и обрабатывается специально во время компиляции: изменения в семантике базовых конструкций часто реализуются путем генерации другого кода. Может даже случиться, что новая функция вводит новый несовместимый синтаксис (такой как новое зарезервированное слово), и в этом случае компилятору, возможно, потребуется проанализировать модуль по-другому. Такие решения не могут быть отложены до времени выполнения.

В документации также упоминается, что единственное, что может предшествовать __future__оператору, - это строка документации модуля, комментарии, пустые строки и другие будущие операторы.

Cyphase
источник
1
First of all, from __future__ import print_function needs to be the first line of code in your script , Могу я узнать почему?
Авинаш Радж
1
@UHMIS, сделай end=' '.
Cyphase
14
Как указано в документации ( docs.python.org/2/reference/simple_stmts.html#future ), это не должно быть первой строки: 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, я отредактировал, чтобы упомянуть об этом, но в первом абзаце было неясно, поэтому я исправил это. Спасибо за указание на это.
Cyphase
1
@AvinashRaj, я не знаю; вам нужно будет спросить UHMIS. Но, как я сказал в комментарии к вашему ответу, возможно, OP внес изменения и не упомянул об этом. И первым комментарием OP было то, что ошибка все еще была.
Cyphase