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:
Por que recebo aspas duplas quando recebo repr(x)? (Eu não os entendo quando eu faço str(x))
Por que recebo 'foo'quando o faço eval("'foo'")e não x, que é o objeto?
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'isnot 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'.
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.
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.
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?
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
O feedback que você recebe sobre o intérprete interativo
repr
também usa . Quando você digita uma expressão (deixe estarexpr
), basicamente o intérpreteresult = expr; if result is not None: print repr(result)
. Portanto, a segunda linha do seu exemplo está formatando a stringfoo
na representação desejada ('foo'
). E então o intérprete cria arepr
essência disso , deixando você com aspas duplas.Não tenho certeza do que você está perguntando aqui. O texto
single ' and double " quotes
, quando analisadorepr
, 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 ligandorepr
.Observe também que a
eval(repr(x)) == x
analogia 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 darepr
saída.fonte
repr
deve ou ser algo que pode ser passado paraeval
(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 porobject.__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, umnamedtuple
tipo criado como local fornecerá o querepr
você pode " teval
), mas foi a ideia original.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:
A partir da saída, vemos que repr () mostra a representação oficial do objeto de data.
fonte
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 essencialmenterepr(repr('foo'))
.2)
eval
calcula 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 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?
fonte
Quando voce diz
você não está passando
foo
para abaz
função.foo
é apenas um nome usado para representar um valor, nesse caso'bar'
, e esse valor é passado para abaz
funçãofonte