Zrozumienie funkcji repr () w Pythonie

152

repr(): wartościowalna reprezentacja ciągu obiektu (może "eval ()" it, co oznacza, że ​​jest to reprezentacja ciągu, która przeliczana jest na obiekt Pythona)

Innymi słowy:

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

Pytania:

  1. Dlaczego dostaję podwójne cudzysłowy, kiedy to robię repr(x)? (Nie rozumiem ich, kiedy to robięstr(x) )
  2. Dlaczego otrzymuję, 'foo'gdy robię, eval("'foo'")a nie x, który jest obiektem?
0101amt
źródło

Odpowiedzi:

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

Więc nazwa xjest dołączona do 'foo'sznurka. Na przykład, repr(x)gdy dzwonisz, tłumacz stawia 'foo'zamiast, xa następnie dzwoni repr('foo').

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

reprw rzeczywistości wywołuje magiczną metodę __repr__of x, która daje ciąg zawierający reprezentację 'foo'przypisanej wartości x. Więc zwraca 'foo'wewnątrz ciągu, w ""wyniku czego "'foo'". Chodzi o reprto, aby podać łańcuch zawierający serię symboli, które możemy wpisać do interpretera i uzyskać tę samą wartość, która została przesłana jako argument repr.

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

Kiedy dzwonimy eval("'foo'"), jest to to samo, co wpisujemy 'foo'w tłumacza. Dzieje się tak, ponieważ bezpośrednio wpisujemy zawartość zewnętrznego ciągu ""w interpreteru.

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

Jeśli zadzwonimy eval('foo'), to tak samo, jak wpisujemy footłumacza. Ale nie ma foodostępnej zmiennej i zgłaszany jest wyjątek.

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

strjest po prostu ciągową reprezentacją obiektu (pamiętaj, xzmienna się odwołuje 'foo'), więc ta funkcja zwraca łańcuch.

>>> str(5)
'5'

Reprezentacja liczby całkowitej w postaci łańcucha 5to '5'.

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

A reprezentacja łańcucha 'foo'to ten sam ciąg 'foo'.

ovgolovin
źródło
Czy możesz nam również podać kilka przypadków użycia, w których należy użyć funkcji repr. Nie jestem w stanie tego pojąć
gaurav parashar
14

Informacje zwrotne, które otrzymujesz na temat interaktywnego tłumacza, reprrównież wykorzystują . Kiedy wpisujesz wyrażenie (niech tak będzie expr), interpreter w zasadzie to robi result = expr; if result is not None: print repr(result). Więc druga linia w twoim przykładzie to formatowanie ciągu foodo żądanej reprezentacji ( 'foo'). Następnie tłumacz tworzy representację tego , pozostawiając cię z podwójnymi cudzysłowami.

Dlaczego, kiedy łączę% r z cudzysłowami podwójnymi i pojedynczymi znakami cudzysłowu i drukuję je, drukuje to tak, jak bym to zapisał w pliku .py, ale nie tak, jak chciałbym to zobaczyć?

Nie jestem pewien, o co pytasz. Tekst single ' and double " quotespo przejściurepr zawiera ucieczki dla jednego rodzaju cytatu. Oczywiście, że tak, w przeciwnym razie nie byłby to prawidłowy literał łańcuchowy według reguł Pythona. Właśnie o to prosiłeś dzwoniącrepr .

Zwróć też uwagę, że eval(repr(x)) == xanalogia nie jest dosłowna. Jest to przybliżenie i jest prawdziwe dla większości (wszystkich?) Typów wbudowanych, ale najważniejsze jest to, że uzyskujesz dość dobre wyobrażenie o typie i logicznej „wartości” patrząc na reprwynik.

Vlad
źródło
2
Początkowo, to rzeczywiście była miało być dosłowne: każda wartość użytkownika reprpowinien być albo coś, co może być przekazany do eval(lub skopiować i wkleić do kodu źródłowego), aby wyprodukować taką samą wartość, lub coś, co podniesie SyntaxError podczas próby że (zazwyczaj <…>styl produkowane przez object.__repr__). To było stopniowo stonowane przez lata i przez 2.7 i 3.x jest to po prostu prawdą "dla wielu typów", a są wyjątki nawet w standardowej bibliotece (np. " namedtupleTyp utworzony jako lokalny da ci to repr, możesz" t eval), ale to był oryginalny pomysł.
abarnert
7

str () jest używana do tworzenia danych wyjściowych dla użytkownika końcowego, podczas gdy repr () jest używana do debuggowania i reprezentuje oficjalny dokument object.

Przykład:

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

Na podstawie wyników widzimy, że repr () pokazuje oficjalną reprezentację obiektu date.

Tanim_113
źródło
3

1) Wynikiem repr('foo')jest ciąg 'foo' . W powłoce Pythona wynik wyrażenia jest również wyrażany jako reprezentacja, więc zasadniczo widziszrepr(repr('foo')) .

2) evaloblicza wynik wyrażenia. Wynik jest zawsze wartością (taką jak liczba, ciąg lub obiekt). Wiele zmiennych może odnosić się do tej samej wartości, jak w:

x = 'foo'
y = x

x i y odnoszą się teraz do tej samej wartości.

3) Nie mam pojęcia, co miałeś na myśli. Czy możesz opublikować przykład i co chciałbyś zobaczyć?

phihag
źródło
1

Kiedy powiesz

foo = 'bar'
baz(foo)

nie przechodzisz foodo bazfunkcji. footo po prostu nazwa używana do reprezentowania wartości, w tym przypadku 'bar', i ta wartość jest przekazywana do bazfunkcji.

SingleNegationElimination
źródło