2010-12-30 15 views
59

para obtener la función 3.0 imprimir hacemos lo siguiente en Python 2.6:¿por qué invocamos de impresión después de importar print_function (en Python 2.6)

from __future__ import print_function 

Pero para usar la función se invoca de impresión() no print_function () ¿Es solo una inconsistencia o hay una buena razón para esto?

¿Por qué no lo siguiente:

from __future__ import print 
+5

Porque si fuera 'print_function()' entonces no tendríamos que tocar el compilador en primer lugar, que es lo que hacen las importaciones '__future__'. –

+0

Pregunta realmente interesante. Lo amo. – Drake

+0

Posible duplicado de [¿Qué es \ _ \ _ futuro \ _ \ _ en Python utilizado y cómo/cuándo usarlo, y cómo funciona] (http://stackoverflow.com/questions/7075082/what-is-future -in-python-used-for-and-how-when-to-use-it-and-how-it-works) –

Respuesta

47

La razón es que cuando se importa desde __future__ que estés realmente sólo la creación de una bandera que dice al intérprete que se comporten de forma diferente a lo habitual - en el caso de print_function, la función print() se pone a disposición en su sitio de la declaración. El módulo __future__ es, por lo tanto, "especial" o "mágico"; no funciona como los módulos habituales.

+3

Es un módulo real. –

+6

Hay un módulo llamado __future__ en el disco y hay una cosa llamada 'print_function' en él, pero la magia real está sucediendo en otro lugar. – delnan

+1

Resumen: existe un módulo de este tipo, pero no es necesario preocuparse por él, ya que la magia se realiza en otro lugar. :) –

3

En Python 3, la palabra clave print ha cambiado de llamar a una declaración llamando a una función.

Por lo tanto, en lugar de decir print value ahora necesita decir print(value), o obtendrá un SyntaxError.

Al hacer el import, este cambio se efectúa en Python 2, también, por lo que puede escribir programas usando la misma sintaxis que Python 3 (al menos en cuanto a print).

+0

¿Por qué no desde __future__ import print? – H2ONaCl

+3

@broiyan: Porque todavía es una declaración en ese punto. –

+1

@broiyan: Porque eso sería confuso, ya que parecería que usted importó el nombre "imprimir" que no tiene. Las importaciones de '__future__' son Magick que cambian la forma en que se comporta la sintaxis de Pythons. –

10

print_function es un FeatureName no se debe confundir con la función incorporada print sí mismo. Es una característica disponible desde el futuro para que pueda usar la función incorporada que puede proporcionar.

Otras características incluyen:

all_feature_names = [ 
    "nested_scopes", 
    "generators", 
    "division", 
    "absolute_import", 
    "with_statement", 
    "print_function", 
    "unicode_literals", 
] 

Hay razones específicas como al migrar el código para la próxima versión más alta, su programa se mantendrá como tal como utilizar la función de actualización en lugar de la versión __future__. Además, si fuera el nombre de la función o la palabra clave en sí misma, puede causar confusión al analizador.

4

Simple. impresión es la palabra clave en Python 2.

lo tanto una declaración como

from somewhere import print 

sería un SyntaxError automática en Python 2.

Permitir (codificando en la sintaxis)

from __future__ import print 

se consideró que no valía la pena el esfuerzo.

0

ejemplo Mínimo

>>> print  # Statement. 

>>> from __future__ import print_function 
>>> print  # Function object. 
<built-in function print> 
>>> print() # Function call. 

>>> 

Como se mencionó en: What is __future__ in Python used for and how/when to use it, and how it worksfrom __future__ son declaraciones mágicas que alteran la forma en Python analiza código.

from __future__ import print_function en particular, cambia print de una declaración a una función incorporada, como se muestra en el shell interactivo anterior.

Por qué print(1) obras sin from __future__ import print_function en Python 2

Debido a que el:

print(1) 

se analiza como:

print (1) 
^^^^^ ^^^ 
1  2 
  1. print comunicado
  2. argumento

en lugar de:

print(1) 
^^^^^^^^ 
1  2 1 
  1. print() función
  2. argumento

Y:

assert 1 == (1) 

como se menciona en: Python tuple trailing comma syntax rule