Comprender la función repr () en Python

152

repr(): representación de cadena evaluable de un objeto (puede "evaluar ()", lo que significa que es una representación de cadena que se evalúa como un objeto de Python)

En otras palabras:

>>> x = 'foo'
>>> repr(x)
"'foo'"

Preguntas:

  1. ¿Por qué recibo las comillas dobles cuando lo hago repr(x)? (No los entiendo cuando lo hago str(x))
  2. ¿Por qué obtengo 'foo'cuando hago eval("'foo'")y no x cuál es el objeto?
0101amt
fuente

Respuestas:

166
>>> x = 'foo'
>>> x
'foo'

Entonces el nombre xse adjunta a la 'foo'cadena. Cuando llama, por ejemplo, repr(x)el intérprete pone en 'foo'lugar de xy luego llama repr('foo').

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

repren realidad llama a un método mágico __repr__de x, que proporciona la cadena que contiene la representación del valor 'foo'asignado a x. Por lo tanto, vuelve 'foo'dentro de la cadena que ""resulta en "'foo'". La idea de repres dar una cadena que contenga una serie de símbolos que podamos escribir en el intérprete y obtener el mismo valor que se envió como argumento repr.

>>> eval("'foo'")
'foo'

Cuando llamamos eval("'foo'"), es lo mismo que escribimos 'foo'en el intérprete. Es como escribimos directamente el contenido de la cadena externa ""en el intérprete.

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

Si llamamos eval('foo'), es lo mismo que escribimos fooen el intérprete. Pero no hay una foovariable disponible y se genera una excepción.

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

stres solo la representación de cadena del objeto (recuerde, xvariable se refiere a 'foo'), por lo que esta función devuelve cadena.

>>> str(5)
'5'

La representación de cadena del número entero 5es '5'.

>>> str('foo')
'foo'

Y la representación de cadena de cadena 'foo'es la misma cadena 'foo'.

ovgolovin
fuente
¿También puede hacernos saber algunos casos de uso en los que uno debería usar la función repr. No puedo comprender eso
gaurav parashar
14

También se utilizan los comentarios que recibe sobre el intérprete interactivo repr. Cuando escribe una expresión (déjalo ser expr), el intérprete básicamente lo hace result = expr; if result is not None: print repr(result). Entonces, la segunda línea en su ejemplo es formatear la cadena fooen la representación que desea ( 'foo'). Y luego el intérprete crea la reprpresentación de eso , dejándolo con comillas dobles.

¿Por qué cuando combino% r con escapes de comillas dobles y comillas simples y los imprimo, lo imprime de la forma en que lo escribiría en mi archivo .py pero no de la forma en que me gustaría verlo?

No estoy seguro de lo que estás preguntando aquí. El texto single ' and double " quotes, cuando se ejecuta repr, incluye escapes para un tipo de presupuesto. Por supuesto que sí, de lo contrario no sería un literal de cadena válido según las reglas de Python. Eso es precisamente lo que pediste llamando repr.

También tenga en cuenta que la eval(repr(x)) == xanalogía no significa literal. Es una aproximación y es válida para la mayoría (¿todos?) De los tipos incorporados, pero lo principal es que se obtiene una idea bastante buena del tipo y el "valor" lógico al mirar la reprsalida.

Vlad
fuente
2
Originalmente, en realidad estaba destinado a ser literal: cada valor reprdebería ser algo que se pueda pasar eval(o copiar y pegar en su código fuente) para producir un valor igual, o algo que genere un SyntaxError cuando lo intente (generalmente El <…>estilo producido por object.__repr__). Eso se atenuó gradualmente a lo largo de los años, y en 2.7 y 3.x es cierto "para muchos tipos", y hay excepciones incluso en stdlib (por ejemplo, un namedtupletipo creado como local le dará un repr"puede"). t eval), pero fue la idea original.
abarnert
7

str () se usa para crear resultados para el usuario final, mientras que repr () se usa para el desarrollo de depuración y representa el oficial del objeto.

Ejemplo:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

De la salida vemos que repr () muestra la representación oficial del objeto date.

Tanim_113
fuente
3

1) El resultado de repr('foo')es la cadena 'foo' . En su shell de Python, el resultado de la expresión también se expresa como una representación, por lo que esencialmente está viendo repr(repr('foo')).

2) evalcalcula el resultado de una expresión. El resultado siempre es un valor (como un número, una cadena o un objeto). Varias variables pueden referirse al mismo valor, como en:

x = 'foo'
y = x

x e y ahora se refieren al mismo valor.

3) No tengo idea de lo que quisiste decir aquí. ¿Puedes publicar un ejemplo y lo que te gustaría ver?

phihag
fuente
1

Cuando tu dices

foo = 'bar'
baz(foo)

No estás pasando fooa la bazfunción. fooes solo un nombre utilizado para representar un valor, en este caso 'bar', y ese valor se pasa a la bazfunción.

SingleNegationElimination
fuente