Zrozumienie funkcji repr () w Pythonie
repr()
: ewaluable string representation of an object (can " eval()"
to, co oznacza, że jest to reprezentacja łańcuchowa, która ewaluuje do Pythona
obiekt)
Innymi słowy:
>>> x = 'foo'
>>> repr(x)
"'foo'"
Pytania:
- Dlaczego dostaję podwójne cudzysłowy, kiedy robię
repr(x)
? (Nie rozumiem ich kiedy robięstr(x)
) - Dlaczego dostaję
'foo'
kiedy robięeval("'foo'")
a nie x który jest obiekt?
5 answers
>>> x = 'foo'
>>> x
'foo'
Więc nazwa x
jest dołączona do 'foo'
string. Po wywołaniu na przykład repr(x)
interpreter umieszcza 'foo'
zamiast x
, a następnie wywołuje repr('foo')
.
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
w rzeczywistości wywołuje magiczną metodę __repr__
z x
, która daje łańcuch zawierający reprezentację wartości 'foo'
przypisanej do x
. Tak więc zwraca 'foo'
wewnątrz łańcucha ""
w wyniku "'foo'"
. Ideą repr
jest nadanie ciągu zawierającego szereg symboli, które możemy wpisać w interpretera i otrzymuje tę samą wartość, która została wysłana jako argument do repr
.
>>> eval("'foo'")
'foo'
Kiedy wywołujemy eval("'foo'")
, jest to to samo, co wpisujemy 'foo'
w interpreterze. Jest tak, jak bezpośrednio wpisujemy zawartość zewnętrznego łańcucha ""
w interpreterze.
>>> 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 wywołamy eval('foo')
, jest to to samo, co wpisujemy foo
w interpreterze. Ale nie ma zmiennej foo
dostępnej i pojawia się wyjątek.
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
str
jest tylko reprezentacją łańcuchową obiektu (pamiętaj, x
zmienna odnosi się do 'foo'
), więc ta funkcja zwraca łańcuch.
>>> str(5)
'5'
Reprezentacja ciągu liczb całkowitych 5
to '5'
.
>>> str('foo')
'foo'
I reprezentacja łańcucha 'foo'
jest tym samym łańcuchem 'foo'
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 08:44:16
Informacje zwrotne, które otrzymujesz na temat interaktywnego interpretera, również wykorzystują repr
. Gdy wpiszesz wyrażenie (niech będzie expr
), interpreter w zasadzie robi to result = expr; if result is not None: print repr(result)
. Więc druga linia w twoim przykładzie to formatowanie ciągu foo
do reprezentacji, którą chcesz ('foo'
). Następnie interpreter tworzy repr
wyrażenie , które, pozostawiając podwójne cudzysłowy.
Nie wiem, o co pytasz. TekstDlaczego gdy łączę %r z podwójnym cytatem i pojedynczym cytatem i drukuję je, drukuje to tak, jak bym to zapisał w pliku. py, ale nie tak, jak bym chciał to zobaczyć?
single ' and double " quotes
, po wykonaniu repr
, zawiera znaki specjalne dla jednego rodzaju cytatu. Oczywiście, że tak, w przeciwnym razie nie byłby to poprawny ciąg znaków według reguł Pythona. Dokładnie o to prosiłeś dzwoniąc repr
.
Zauważ również, że analogia eval(repr(x)) == x
nie jest dosłowna. Jest przybliżeniem i odnosi się do większości (wszystkich?) wbudowane typy, ale najważniejsze jest to, że otrzymujesz dość dobre wyobrażenie o typie i logicznej "wartości" patrząc na wyjście repr
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 13:48:26
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 widzisz repr(repr('foo'))
.
2) eval
oblicza wynik wyrażenia. Wynikiem jest zawsze wartość (np. liczba, łańcuch znaków 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 napisz przykład i co chciałbyś zobaczyć?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-16 12:14:23
Kiedy mówisz
foo = 'bar'
baz(foo)
Nie przechodzisz {[1] } do funkcji baz
. foo
jest tylko nazwą używaną do reprezentowania wartości, w tym przypadku 'bar'
, a wartość ta jest przekazywana do funkcji baz
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-16 12:22:07
Str() jest używane do tworzenia danych wyjściowych dla użytkownika końcowego, podczas gdy repr () jest używane do tworzenia debuggin.I jest reprezentantem obiektu.
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)'
Z wyjścia widzimy, że repr () pokazuje oficjalną reprezentację obiektu date.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-06 18:59:15