2011-08-18 10 views
6

En el intérprete puede simplemente escribir el nombre de un objeto, p. una lista a = [1, 2, 3, u"hellö"] en el símbolo del intérprete de la siguiente manera:¿Cuál es la diferencia entre `>>> some_object` y` >>> print some_object` en el intérprete de Python?

>>> a 
[1, 2, 3, u'hell\xf6'] 

o puede hacerlo:

>>> print a 
[1, 2, 3, u'hell\xf6'] 

que parece equivalente para las listas. En este momento estoy trabajando con hdf5 para administrar algunos datos y me di cuenta de que hay una diferencia entre los dos métodos mencionados anteriormente. Teniendo en cuenta:

with tables.openFile("tutorial.h5", mode = "w", title = "Some Title") as h5file: 
    group = h5file.createGroup("/", 'node', 'Node information') 
    tables.table = h5file.createTable(group, 'readout', Node, "Readout example") 

La salida de

print h5file 

difiere de

>>> h5file 

Así que me preguntaba si alguien podría explicar las diferencias de comportamiento de Python en estos dos casos?

Respuesta

8

Al escribir un objeto en el terminal llama al __repr__(), que es para una representación detallada del objeto que está imprimiendo (no ambiguo). Cuando dices algo para 'imprimir', estás llamando al __str__() y, por lo tanto, estás pidiendo algo legible por humanos.

Alex Martelli dio una gran explicación here. Otras respuestas en el hilo también pueden iluminar la diferencia.

Por ejemplo, eche un vistazo a los objetos datetime.

>>> import datetime 
>>> now = datetime.datetime.now() 

Comparar ...

>>> now 
Out: datetime.datetime(2011, 8, 18, 15, 10, 29, 827606) 

a ...

>>> print now 
Out: 2011-08-18 15:10:29.827606 

suerte que hace que sea un poco más claro!

1

La instrucción de impresión siempre llama al método x.__str__() mientras (solo en el interperador interactivo) simplemente llama a una variable llamada x.__repr__() del método.

>>> '\x02agh' 
'\x02agh' 
>>> print '\x02agh' 
'agh' 
+0

¿Dónde está esto documentado? No pude encontrarlo – jtbandes

+0

@jtbandes No sabe dónde, pero puede probarlo usted mismo. PD: ¿Alguien puede complacer el formato de los códigos en línea, verdad? No funciona en un dispositivo móvil. Gracias ! –

+0

Por supuesto que puedo probarlo, eso no es lo que pregunté :) – jtbandes

2

El intérprete interactivo imprimirá el resultado de cada expresión escrita en él. (Dado que las declaraciones no evalúan, sino que ejecutan, este tipo de impresión que no se aplica a las declaraciones tales como print sí, bucles, etc.)

La prueba de que repr() es utilizado por el intérprete interactivo según lo declarado por Niklas Rosenstein (utilizando una 2.6 intérprete):

>>> class Foo: 
... def __repr__(self): 
...  return 'repr Foo' 
... def __str__(self): 
...  return 'str Foo' 
... 
>>> x = Foo() 
>>> x 
repr Foo 
>>> print x 
str Foo 

Así, mientras que la declaración print puede ser innecesario en el intérprete interactivo (a menos que necesite str y no repr), el intérprete no interactivo no hace esto. Colocando el código anterior en un archivo y ejecutando el archivo no se imprimirá nada.

+0

Sí, x se imprimirá, porque hay una declaración de impresión;) –

+0

Ha, eso es gracioso. Edité la respuesta para incluir la declaración 'print x' para mostrar que uno usa' str' y el otro 'repr' y olvidé enmendar el párrafo final. – wberry

0

mirada a la documentación de Python en: http://docs.python.org/reference/datamodel.html#object.repr

objeto. repr (auto)

Called by the repr() built-in function and by string conversions 

(cotizaciones inversa) para calcular la representación “oficial” cadena de un objeto . Si es posible, debería parecer una expresión válida de Python que podría usarse para recrear un objeto con el mismo valor (dado un entorno apropiado). Si esto no es posible, se debe devolver una cadena del formulario < ... alguna descripción útil ...>. El valor de retorno debe ser un objeto de cadena. Si una clase define repr(), pero no str(), entonces repr() también se utiliza cuando una representación cadena “informal” de las instancias de esa clase es necesario.

This is typically used for debugging, so it is important that the 

representación es rica en información y sin ambigüedades.

objeto. str (auto)

Called by the str() built-in function and by the print statement 

para calcular la representación de cadena “informal” de un objeto. Este difiere de repr() en que no tiene que ser una expresión válida de Python : en su lugar, se puede usar una representación más conveniente o concisa . El valor de retorno debe ser un objeto de cadena.

Ejemplo:

>>> class A(): 
... def __repr__(self): return "repr!" 
... def __str__(self): return "str!" 
... 
>>> a = A() 
>>> a 
repr! 
>>> print(a) 
str! 
>>> class B(): 
... def __repr__(self): return "repr!" 
... 
>>> class C(): 
... def __str__(self): return "str!" 
... 
>>> b = B() 
>>> b 
repr! 
>>> print(b) 
repr! 
>>> c = C() 
>>> c 
<__main__.C object at 0x7f7162efb590> 
>>> print(c) 
str! 

función de impresión imprime la consola cada argumentos __str__. Me gusta print(str(obj)).

Pero en la consola interactiva, imprime el valor de retorno __repr__ de la función de impresión. Y si no se definió __str__, podría usarse __repr__.

Idealmente, __repr__ significa que deberíamos usar esa representación para reproducir ese objeto. No debería ser idéntico entre diferentes clases, o de objeto que representa valores diferentes, por ejemplo, datetime.time:

Pero __str__ (lo que obtenemos de str(obj)) debe parecer agradable, porque lo mostramos a los usuarios.

>>> a = datetime.time(16, 42, 3) 
>>> repr(a) 
'datetime.time(16, 42, 3)' 
>>> str(a) 
'16:42:03' #We dont know what it is could be just print: 
>>> print("'16:42:03'") 
'16:42:03' 

Y, perdón por mal inglés :).

0

print(variable) es igual a print(str(variable))

mientras que

variable es igual a print(repr(variable))

Obviamente, el método del objeto h5file__repr__ y __str__ producir resultados diferentes.

Cuestiones relacionadas