Compreendendo a função repr () em Python

152

repr(): representação de cadeia de caracteres avaliada de um objeto (pode "eval ()", o que significa que é uma representação de cadeia de caracteres que é avaliada em um objeto Python)

Em outras palavras:

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

Questões:

  1. Por que recebo aspas duplas quando recebo repr(x)? (Eu não os entendo quando eu faço str(x))
  2. Por que recebo 'foo'quando o faço eval("'foo'")e não x, que é o objeto?
0101amt
fonte

Respostas:

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

Portanto, o nome xestá anexado à 'foo'string. Quando você chama, por exemplo, repr(x)o intérprete coloca em 'foo'vez de xe depois chama repr('foo').

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

reprrealmente chama um método mágico __repr__de x, que fornece a string que contém a representação do valor 'foo'atribuído a x. Portanto, ele retorna 'foo'dentro da string ""resultante "'foo'". A idéia repré fornecer uma string que contenha uma série de símbolos que possamos digitar no intérprete e obter o mesmo valor que foi enviado como argumento para repr.

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

Quando chamamos eval("'foo'"), é o mesmo que digitamos 'foo'no intérprete. É como digitamos diretamente o conteúdo da string externa ""no 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

Se ligarmos eval('foo'), é o mesmo que digitarmos foono intérprete. Mas não há foovariável disponível e uma exceção é gerada.

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

stré apenas a representação de string do objeto (lembre-se, a xvariável refere-se a 'foo'), portanto, essa função retorna string.

>>> str(5)
'5'

A representação de sequência de número inteiro 5é '5'.

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

E a representação de string de string 'foo'é a mesma string 'foo'.

ovgolovin
fonte
Você também pode nos informar sobre alguns casos de uso em que se deve usar a função repr. Eu sou incapaz de compreender isso #
gaurav parashar
14

O feedback que você recebe sobre o intérprete interativo reprtambém usa . Quando você digita uma expressão (deixe estar expr), basicamente o intérprete result = expr; if result is not None: print repr(result). Portanto, a segunda linha do seu exemplo está formatando a string foona representação desejada ( 'foo'). E então o intérprete cria a repressência disso , deixando você com aspas duplas.

Por que quando eu combino% r com aspas duplas e aspas simples e as imprimo, ela é impressa da maneira que eu escreveria no meu arquivo .py, mas não da maneira que eu gostaria de ver?

Não tenho certeza do que você está perguntando aqui. O texto single ' and double " quotes, quando analisado repr, inclui escapes para um tipo de citação. Claro que sim, caso contrário, não seria uma string válida literal pelas regras do Python. Foi exatamente o que você pediu ligando repr.

Observe também que a eval(repr(x)) == xanalogia não é literal. É uma aproximação e vale para a maioria dos tipos internos (todos?), Mas o principal é que você tenha uma boa idéia do tipo e do "valor" lógico da procura da reprsaída.

Vlad
fonte
2
Originalmente, ele realmente foi feito para ser literal: cada valor de reprdeve ou ser algo que pode ser passado para eval(ou copiado e colado em seu código-fonte) para produzir um valor igual, ou algo que vai levantar um SyntaxError quando você tentar isso (geralmente o <…>estilo produzido por object.__repr__). Isso foi diminuindo gradualmente ao longo dos anos, e para 2.7 e 3.x é verdade "para muitos tipos", e há exceções até no stdlib (por exemplo, um namedtupletipo criado como local fornecerá o que reprvocê pode " t eval), mas foi a ideia original.
abarnert
7

str () é usado para criar saída para o usuário final, enquanto repr () é usado para o desenvolvimento de depuração. E representa o oficial do objeto.

Exemplo:

>>> 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)'

A partir da saída, vemos que repr () mostra a representação oficial do objeto de data.

Tanim_113
fonte
3

1) O resultado de repr('foo')é a sequência 'foo' . No seu shell Python, o resultado da expressão também é expresso como uma representação, então você está vendo essencialmente repr(repr('foo')).

2) evalcalcula o resultado de uma expressão. O resultado é sempre um valor (como um número, uma sequência ou um objeto). Várias variáveis ​​podem se referir ao mesmo valor, como em:

x = 'foo'
y = x

x e y agora se referem ao mesmo valor.

3) Não faço ideia do que você quis dizer aqui. Você pode postar um exemplo e o que gostaria de ver?

phihag
fonte
1

Quando voce diz

foo = 'bar'
baz(foo)

você não está passando foopara a bazfunção. fooé apenas um nome usado para representar um valor, nesse caso 'bar', e esse valor é passado para a bazfunção

SingleNegationElimination
fonte