¿Por qué el paréntesis en la impresión es voluntario en Python 2.7?
printing python-3.x (4)
En Python 2.7 ambos lo siguiente harán lo mismo
print("Hello, World!") # Prints "Hello, World!"
print "Hello, World!" # Prints "Hello, World!"
Sin embargo, lo siguiente no
print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")
print "Hello,", "World!" # Prints the words "Hello, World!"
En Python 3.x, el paréntesis en la print
es obligatorio, esencialmente haciendo que sea una función, pero en 2.7 ambas funcionarán con resultados diferentes. ¿Qué más debería saber sobre print
en Python 2.7?
Aquí tenemos un efecto secundario interesante cuando se trata de UTF-8.
>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek[''dog''], greek[''cat'']
σκύλος γάτα
>> print (greek[''dog''], greek[''cat''])
(''/xcf/x83/xce/xba/xcf/x8d/xce/xbb/xce/xbf/xcf/x82'', ''/xce/xb3/xce/xac/xcf/x84/xce/xb1'')
La última impresión es una tupla con valores de bytes hexadecimales.
Básicamente en Python antes de Python 3, print era una declaración especial que imprimía todas las cadenas si se obtenían como argumentos. Así que print "foo","bar"
simplemente significa "imprimir" foo "seguido de" barra "". El problema con eso era que era tentador actuar como si imprimir fuera una función, y la gramática de Python es ambigua en eso, ya que (a,b)
es una tupla que contiene a
y b
pero foo(a,b)
es una llamada a una función de dos argumentos.
Entonces hicieron el cambio incompatible para 3 para hacer que los programas sean menos ambiguos y más regulares.
(En realidad, creo que 2.7 se comporta como lo hizo 2.6 en esto, pero no estoy seguro).
En Python 2.x print
es realmente una declaración especial y no una función *.
Esta es también la razón por la cual no se puede usar como: lambda x: print x
Tenga en cuenta que (expr)
no crea una Tupla (resulta en expr
), pero sí lo hace. Esto probablemente resulte en la confusión entre print (x)
e print (x, y)
en Python 2.7
(1) # 1 -- no tuple Mister!
(1,) # (1)
(1,2) # (1,2)
1,2 # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]
Sin embargo, dado que print
es una construcción de declaración / gramática de sintaxis especial en Python 2.x, entonces, sin el paréntesis, trata el ,
de una manera especial, y no crea un Tuple. Este tratamiento especial de la declaración de print
permite actuar de manera diferente si hay un final o no.
Feliz codificación.
* Este comportamiento de print
en Python 2 se puede cambiar al de Python 3:
from __future__ import print_function
Todo es muy simple y no tiene nada que ver con la compatibilidad hacia adelante o hacia atrás.
La forma general de la declaración de print
en todas las versiones de Python anteriores a la versión 3 es:
print expr1, expr2, ... exprn
(Cada expresión a su vez se evalúa, se convierte en una cadena y se muestra con un espacio entre ellas).
Pero recuerde que poner paréntesis alrededor de una expresión sigue siendo la misma expresión.
Entonces también puedes escribir esto como:
print (expr1), (expr2), ... (expr3)
Esto no tiene nada que ver con llamar a una función.