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:

  1. Dlaczego dostaję podwójne cudzysłowy, kiedy robię repr(x)? (Nie rozumiem ich kiedy robię str(x))
  2. Dlaczego dostaję 'foo' kiedy robię eval("'foo'") a nie x który jest obiekt?
 114
Author: Antti Haapala, 2011-10-16

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

 139
Author: ovgolovin,
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 reprwyrażenie , które, pozostawiając podwójne cudzysłowy.

Dlaczego 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ć?

Nie wiem, o co pytasz. Tekst 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.

 9
Author: Vlad,
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ć?

 2
Author: phihag,
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.

 2
Author: SingleNegationElimination,
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.

 0
Author: Tanim_113,
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