¿Por qué el uso de __future__ import print_function interrumpe la impresión al estilo Python2? [cerrado]

135

Soy nuevo en programación con python, y estoy tratando de imprimir con un separador y finalizar, pero todavía me da un error de sintaxis.

Estoy usando python 2.7.

Aquí está mi código:

from __future__ import print_function
import sys, os, time

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

Y aquí está el error:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$
UHMIS
fuente
44
Importó imprimir como una función, pero aún lo trata como una declaración .
jonrsharpe
44
no puede llamar a print sin el paréntesis porque ha cambiado print para que sea una función print (args)
Charlie Parker

Respuestas:

210

En primer lugar, from __future__ import print_functiondebe ser la primera línea de código en su script (aparte de algunas excepciones mencionadas a continuación). En segundo lugar, como han dicho otras respuestas, ahora debe usarlo printcomo una función. De eso se trata from __future__ import print_function; para traer la print función de Python 3 a 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__las declaraciones deben estar cerca de la parte superior del archivo porque cambian cosas fundamentales sobre el lenguaje, por lo que el compilador debe saberlas desde el principio. De la documentación :

Una declaración futura se reconoce y trata especialmente en el momento de la compilación: los cambios en la semántica de las construcciones centrales a menudo se implementan mediante la generación de código diferente. Incluso puede darse el caso de que una nueva característica introduzca una nueva sintaxis incompatible (como una nueva palabra reservada), en cuyo caso el compilador puede necesitar analizar el módulo de manera diferente. Tales decisiones no pueden ser postergadas hasta el tiempo de ejecución.

La documentación también menciona que las únicas cosas que pueden preceder a una __future__declaración son la cadena de documentación del módulo, comentarios, líneas en blanco y otras declaraciones futuras.

Cifrado
fuente
1
First of all, from __future__ import print_function needs to be the first line of code in your script , ¿Puedo saber por qué?
Avinash Raj
1
@UHMIS, hazlo end=' '.
Cyphase
14
Como se indica en la documentación ( docs.python.org/2/reference/simple_stmts.html#future ) que tiene no ser la primera línea: 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, edité para mencionar eso, pero no estaba claro en el primer párrafo, así que lo arreglé. Gracias por mencionarlo.
Cyphase
1
@AvinashRaj, no lo sé; tendrías que preguntarle a UHMIS. Pero como dije en un comentario a su respuesta, quizás OP hizo un cambio y no lo mencionó. Y el primer comentario de OP fue que todavía había un error.
Cyphase