python
  • repr
  • 2011-10-16 193 views 100 likes 
    100

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

    En otras palabras:

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

    Preguntas:

    1. ¿Por qué recibo las comillas dobles cuando lo haga repr(x)? (No entiendo ellas cuando lo haga str(x))
    2. ¿Por qué obtengo 'foo' cuando lo haga eval("'foo'") y no x que es el objeto ?
    +2

    proporciona un muy buen ejemplo de comportamiento real/esperado para 1, pero no para 3. ¿cuál es la forma en que le gustaría verlo? – SingleNegationElimination

    +0

    Por favor, elabore sobre la pregunta 3d. Es una buena idea dar un ejemplo. Ahora no está claro lo que quieres lograr. – ovgolovin

    +0

    @TokenMacGuy Publiqué una nueva pregunta acerca de eso. No sé por qué, pero no pude editar esta publicación para ingresar el código real. Gracias por ayudarme. – 0101amt

    Respuesta

    125
    >>> x = 'foo' 
    >>> x 
    'foo' 
    

    Así que el nombre x se adjunta a 'foo' cadena. Cuando llama por ejemplo repr(x) el intérprete pone 'foo' en lugar de x y luego llama al repr('foo').

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

    repr llama en realidad un método mágico __repr__ de x, que da la cadena que contiene la representación del valor asignado a 'foo'x. Entonces devuelve 'foo' dentro de la cadena "" dando como resultado "'foo'". La idea de repr es dar una cadena que contiene una serie de símbolos que podemos escribir en el intérprete y obtener el mismo valor que se envió como argumento al repr.

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

    Cuando llamamos eval("'foo'"), que es lo mismo que escribimos 'foo' en el intérprete. Es como escribimos directamente los contenidos 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'), que es lo mismo que escribimos foo en el intérprete. Pero no hay una variable foo disponible y se genera una excepción.

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

    str es sólo la representación de cadena del objeto (recuerda, x variable se refiere a 'foo'), por lo que esta función devuelve cadena.

    >>> str(5) 
    '5' 
    

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

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

    y collar de cadena 'foo' es la misma cadena 'foo'.

    1

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

    2) eval calcula el resultado de una expresión. El resultado es siempre un valor de (como un número, una cadena o un objeto). Múltiples 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 usted quiso decir aquí. ¿Puedes publicar un ejemplo y lo que te gustaría ver?

    7

    La retroalimentación que recibe en el intérprete interactivo también usa repr. Cuando escribe una expresión (déjela ser expr), el intérprete básicamente hace result = expr; if result is not None: print repr(result). Entonces, la segunda línea en su ejemplo es formateando la cadena foo en la representación que desea ('foo'). Y luego el intérprete crea la esencia de repr de que, dejándole con comillas dobles.

    ¿Por qué cuando combino% r con comillas dobles y comilla simple se escapa e imprimirlos, se imprime la forma en que me gustaría escribir en mi archivo .py, pero no de la manera que me gustaría ver ¿eso?

    No estoy seguro de lo que está preguntando aquí. El texto single ' and double " quotes, cuando se ejecuta a través de repr, incluye escapes para un tipo de cita. 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 solicitó llamando al repr.

    También tenga en cuenta que la analogía eval(repr(x)) == x no es 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 del "valor" lógico al mirar la salida repr.

    1

    Cuando dice

    foo = 'bar' 
    baz(foo) 
    

    usted no está de paso foo a la función baz. foo es solo un nombre usado para representar un valor, en este caso 'bar', y ese valor se pasa a la función baz.

    Cuestiones relacionadas