>>> x = 'foo'
>>> x
'foo'
Więc nazwa x
jest dołączona do 'foo'
sznurka. Na przykład, repr(x)
gdy dzwonisz, tłumacz stawia 'foo'
zamiast, x
a następnie dzwoni repr('foo')
.
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
w 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 repr
to, 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 foo
tłumacza. Ale nie ma foo
dostępnej zmiennej i zgłaszany jest wyjątek.
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
str
jest po prostu ciągową reprezentacją obiektu (pamiętaj, x
zmienna się odwołuje 'foo'
), więc ta funkcja zwraca łańcuch.
>>> str(5)
'5'
Reprezentacja liczby całkowitej w postaci łańcucha 5
to '5'
.
>>> str('foo')
'foo'
A reprezentacja łańcucha 'foo'
to ten sam ciąg 'foo'
.
Informacje zwrotne, które otrzymujesz na temat interaktywnego tłumacza,
repr
również wykorzystują . Kiedy wpisujesz wyrażenie (niech tak będzieexpr
), interpreter w zasadzie to robiresult = expr; if result is not None: print repr(result)
. Więc druga linia w twoim przykładzie to formatowanie ciągufoo
do żądanej reprezentacji ('foo'
). Następnie tłumacz tworzyrepr
esentację tego , pozostawiając cię z podwójnymi cudzysłowami.Nie jestem pewien, o co pytasz. Tekst
single ' and double " quotes
po 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)) == x
analogia 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 narepr
wynik.źródło
repr
powinien być albo coś, co może być przekazany doeval
(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 przezobject.__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. "namedtuple
Typ utworzony jako lokalny da ci torepr
, możesz" teval
), ale to był oryginalny pomysł.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:
Na podstawie wyników widzimy, że repr () pokazuje oficjalną reprezentację obiektu date.
źródło
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)
eval
oblicza 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 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ć?
źródło
Kiedy powiesz
nie przechodzisz
foo
dobaz
funkcji.foo
to po prostu nazwa używana do reprezentowania wartości, w tym przypadku'bar'
, i ta wartość jest przekazywana dobaz
funkcji.źródło