¿por qué invocamos imprimir después de importar print_function (en Python 2.6)

Para obtener la función de impresión 3.0, hacemos lo siguiente en Python 2.6:

from __future__ import print_function 

Pero para usar la función invocamos print () no print_function (). ¿Es esto solo una inconsistencia o hay una buena razón para esto?

¿Por qué no lo siguiente?

 from __future__ import print 

La razón es que cuando importa desde __future__ simplemente está configurando un indicador que le dice al intérprete que se comporte un poco diferente de lo normal: en el caso de print_function , la función print() está disponible en lugar de la instrucción. El módulo __future__ es, por lo tanto, “especial” o “mágico”, no funciona como los módulos habituales.

print_function es un FeatureName no debe confundirse con la función incorporada de print . Es una característica que está disponible en el futuro para que pueda utilizar 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", ] 

Existen razones específicas, ya que cuando migra su código a la siguiente versión superior, su progtwig seguirá siendo así, por ejemplo, al usar la función actualizada en lugar de la versión __future__ . Además, si era el nombre de la función o la palabra clave en sí, puede causar confusión en el analizador.

En Python 3, la palabra clave de print se ha cambiado de llamar a una statement para llamar a una función.

Entonces, en lugar de decir el print value , ahora necesita decir print(value) , o obtendrá un SyntaxError .

Al realizar la import , este cambio también se realiza en Python 2, por lo que puede escribir progtwigs con la misma syntax que Python 3 (al menos en lo que respecta a la print ).

Sencillo. imprimir es una palabra clave en Python 2.

Así que una statement como

 from somewhere import print 

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

Permitir (codificarlo en la syntax)

 from __future__ import print 

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

Ejemplo minimo

 >>> print # Statement. >>> from __future__ import print_function >>> print # Function object.  >>> print() # Function call. >>> 

Como se mencionó en: ¿Para qué se usa __future__ en Python y cómo / cuándo usarlo, y cómo funciona from __future__ son declaraciones mágicas que alteran la forma en que Python analiza el código.

from __future__ import print_function en particular los cambios se print desde una statement a una función incorporada, como se muestra en el shell interactivo anterior.

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

Porque el:

 print(1) 

se analiza como

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

en lugar de:

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

Y:

 assert 1 == (1) 

como se mencionó en: Regla de syntax de coma que se arrastra de la tupla de Python

Para completar, todas las características disponibles actualmente son:

 +------------------+-------------+--------------+----------------------------------------------------+ | feature | optional in | mandatory in | effect | +------------------+-------------+--------------+----------------------------------------------------+ | nested_scopes | 2.1.0b1 | 2.2 | PEP 227: Statically Nested Scopes | | generators | 2.2.0a1 | 2.3 | PEP 255: Simple Generators | | division | 2.2.0a2 | 3.0 | PEP 238: Changing the Division Operator | | absolute_import | 2.5.0a1 | 3.0 | PEP 328: Imports: Multi-Line and Absolute/Relative | | with_statement | 2.5.0a1 | 2.6 | PEP 343: The “with” Statement | | print_function | 2.6.0a2 | 3.0 | PEP 3105: Make print a function | | unicode_literals | 2.6.0a2 | 3.0 | PEP 3112: Bytes literals in Python 3000 | | generator_stop | 3.5.0b1 | 3.7 | PEP 479: StopIteration handling inside generators | | annotations | 3.7.0b1 | 4.0 | PEP 563: Postponed evaluation of annotations | +------------------+-------------+--------------+----------------------------------------------------+