2011-05-14 16 views

Respuesta

279

El %s especificador convierte el objeto utilizando str(), y %r la convierte usando repr().

Para algunos objetos tales como números enteros, producen el mismo resultado, pero repr() es especial en que (para tipos de que esto sea posible) que convencionalmente devuelve un resultado que es sintaxis Python válida, que podría ser utilizado para volver a crear de forma inequívoca la objeto que representa.

He aquí un ejemplo, usando una fecha:

>>> import datetime 
>>> d = datetime.date.today() 
>>> str(d) 
'2011-05-14' 
>>> repr(d) 
'datetime.date(2011, 5, 14)' 

tipos para los que repr() no produce sintaxis de Python incluyen aquellas que hacen referencia a los recursos externos tales como un file, que no se puede garantizar a recrear en un contexto diferente.

+39

Me encanta este ejemplo, porque muestra una gran diferencia entre% s y% r ... la mayoría de los ejemplos solo muestran algo como 'apple' vs. apple, y luego no está claro por qué incluso tenemos% r. – macloo

+1

¿Cómo se implementaría el% especificador en Python 3.3? También estoy siguiendo la secuencia Learn Python the Hard Way, pero he descubierto que hay varias diferencias de sintaxis entre las versiones de Python. – nitrl

+0

Gracias. Me preguntaba por qué uno podría usar el% r, pero ahora entiendo por su ejemplo anterior. –

14

%r muestra con citas:

Será como:

I said: 'There are 10 types of people.'. 

Si se hubiera usado %s habría sido:

I said: There are 10 types of people.. 
+14

solo es verdadero para cadenas, otros tipos tienen un comportamiento diferente –

+4

@Winston Ewert - por supuesto, estaba respondiendo al ejemplo de la pregunta, ya que en el ejemplo se utilizó claramente para producir las comillas. – manojlds

14

Ésta es una versión de la respuesta de Ben James , arriba:

>>> import datetime 
>>> x = datetime.date.today() 
>>> print x 
2013-01-11 
>>> 
>>> 
>>> print "Today's date is %s ..." % x 
Today's date is 2013-01-11 ... 
>>> 
>>> print "Today's date is %r ..." % x 
Today's date is datetime.date(2013, 1, 11) ... 
>>> 

Cuando ejecuté esto, me ayudó a ver la utilidad de% r.

+7

¿Qué significa esto para su respuesta? – fugu

+3

@fugu en realidad Da un ejemplo de impresión usando el especificador '% r' y'% s', para que los usuarios puedan ver las diferencias más claramente. – amanuel2

+0

Gracias @ amanuel2 - exactamente mi intención. – macloo

15

Utilice el %r para la depuración, ya que muestra los datos "en bruto" de la variable, , pero los demás se utilizan para mostrar a los usuarios.

Así es como funciona el formato %r; lo imprime de la forma en que lo escribió (o cerca de él). Es el formato "en bruto" para la depuración. Aquí \n utilizado para mostrar a los usuarios no funciona. %r muestra la representación si los datos brutos de la variable.

months = "\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug" 
print "Here are the months: %r" % months 

Salida:

Here are the months: '\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug' 

Comprobar this example de aprender Python la manera dura.

Cuestiones relacionadas