Cel __repr__ w Pythonie

139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Jakie jest znaczenie / cel tej metody?

zjm1126
źródło
@ zjm1126: czy chcesz wiedzieć, dlaczego >>> variabledrukuje to, co __repr__()zwraca?
Esteban Küber
18
Ta dokumentacja usypia ludzi. Ponadto warto uczyć się od innych, jak to jest używane.
Concerned_Citizen
Możliwy duplikat różnicy między __str__ a __repr__ w Pythonie
Vlad Bezden
2
Dla programistów Java, którzy uczą się Pythona, najlepszym sposobem spojrzenia na to jest toString () w Javie.
Ravi

Odpowiedzi:

188

__repr__powinien zwrócić drukowalną reprezentację obiektu, najprawdopodobniej jeden z możliwych sposobów utworzenia tego obiektu. Zobacz oficjalną dokumentację tutaj . __repr__jest bardziej dla programistów, a __str__dla użytkowników końcowych.

Prosty przykład:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
leniwy 1
źródło
2
lazy1: Przede wszystkim chciałem naprawić formatowanie (przydatne jest, aby przykłady były jak najbliższe temu, co zobaczą w przykładowej sesji), ale dostosowałem również format wyjściowy, aby wyraźnie różnił się od przypisania, ponieważ znacznie poprawia przejrzystość dla kogoś, kto jest zdezorientowany, imho. (Jeśli zaszedłem za daleko, po prostu przeredaguj, a będę ci winien piwo.)
1
To powinno być może użyć% r zamiast% s: stackoverflow.com/questions/6005159/ ...
Jonathan Adelson
43
To nie jest tak naprawdę poprawne. __str__jest wyjściem, które powinno być czytelne dla człowieka: __repr__powinno być reprezentacją możliwą do odczytania dla interpretera Pythona (tzn. podanie ciągu do interpretera powinno odtworzyć obiekt). Jeśli jednak obiekt nie ma __str__metody, __repr__jest używany zamiast tego. Jak zauważono: ten przykład faktycznie wypisuje __str__metodę self.xand self.y: %rpowinno być użyte zamiast %sw operacji formatowania łańcucha (ponieważ klasa nie definiuje __str__, w __repr__rzeczywistości jest zwracana, ale jest to anomalia).
Daniel Andersson,
20

Jest to dość dobrze wyjaśnione w dokumentacji Pythona :

repr ( obiekt ): Zwraca ciąg zawierający drukowalną reprezentację obiektu. Jest to ta sama wartość, jaką dają konwersje (odwrotne cudzysłowy). Czasami warto mieć dostęp do tej operacji jako zwykłej funkcji. W przypadku wielu typów funkcja ta podejmuje próbę zwrócenia ciągu znaków, który dałby obiekt o tej samej wartości po przekazaniu do eval(), w przeciwnym razie reprezentacja jest łańcuchem zamkniętym w nawiasach ostrych, który zawiera nazwę typu obiektu wraz z dodatkowymi informacjami często zawiera nazwę i adres obiektu. Klasa może kontrolować, co ta funkcja zwraca dla swoich instancji, definiując __repr__()metodę.

Widzisz tutaj domyślną implementację __repr__, która jest przydatna do serializacji i debugowania.

dmazzoni
źródło
5
Myślę, że metoda odwróconych cudzysłowów (lub „odwrotnych znaków”) uzyskiwania „reprezentacji” obiektu jest przestarzała i została usunięta w wersji 3.0
MatrixFrog
MatrixFrog: oba są prawdziwe, ale obecna dokumentacja 2.x nadal mówi to, skąd pochodzi cytat.
W przypadku wielu obiektów __repr__ i __str__ pełnią tę samą funkcję. W rzeczywistości, jeśli zdefiniujesz tylko __str__, wówczas __repr__ domyślnie po prostu wywoła __str__. Najbardziej oczywistym przypadkiem, w którym nie jest to prawdą, są same łańcuchy: str ('stackoverflow') zwraca, stackoverflowale repr ('stackoverflow') tak 'stackoverflow'.
MatrixFrog
6
Masz to od tyłu, __repr__ nigdy nie używa __str__, ale może się zdarzyć odwrotnie. Zobacz docs.python.org/reference/…
13

__repr__jest używany przez samodzielny interpreter języka Python do wyświetlania klasy w formacie drukowalnym. Przykład:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

W przypadkach, gdy __str__metoda nie jest zdefiniowana w klasie, wywoła __repr__funkcję w celu utworzenia reprezentacji do druku.

>>> str(demo)
'<StackOverflow demo object __repr__>'

Ponadto print()klasa wywoła __str__domyślnie.


Dokumentacja , proszę


źródło
7

Metoda __repr__ po prostu mówi Pythonowi, jak drukować obiekty klasy

Jasper Kinoti
źródło
1

Przykład pokazujący różnice między nimi (skopiowałem z tego źródła ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

Zwroty z repr()i str()są identyczne dla int x, ale istnieje różnica między wartościami zwracanymi dla str y- jedna jest formalna, a druga nieformalna . Jedną z najważniejszych różnic między reprezentacjami formalnymi i nieformalnymi jest to, że domyślną implementację __repr__wartości str można wywołać jako argument funkcji eval, a wartość zwracana byłaby prawidłowym obiektem typu string, na przykład:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Jeśli spróbujesz wywołać zwracaną wartość __str__jako argument do eval, wynik nie będzie prawidłowy.

Anh-Thi DINH
źródło
1

Kiedy tworzymy nowe typy, definiując klasy, możemy skorzystać z pewnych funkcji Pythona, aby uczynić nowe klasy wygodniejszymi w użyciu. Jedną z tych cech są „metody specjalne”, zwane również „metodami magicznymi”.

Metody specjalne mają nazwy zaczynające się i kończące dwoma podkreśleniami. Definiujemy je, ale zwykle nie nazywamy ich bezpośrednio po imieniu. Zamiast tego są wykonywane automatycznie w określonych okolicznościach.

Wygodne jest, aby móc wyprowadzić wartość wystąpienia obiektu za pomocą instrukcji print. Gdy to robimy, chcielibyśmy, aby wartość była reprezentowana w wyniku w jakimś zrozumiałym i jednoznacznym formacie. Repr sposób szczególny mogą być wykorzystane do zorganizowania tak się stało. Jeśli zdefiniujemy tę metodę, może ona zostać wywołana automatycznie, gdy wydrukujemy wartość wystąpienia klasy, dla której zdefiniowaliśmy tę metodę. Należy jednak wspomnieć, że istnieje również specjalna metoda str , używana w podobnym, ale nie identycznym celu, która może mieć pierwszeństwo, jeśli ją również zdefiniujemy.

Jeśli nie zdefiniowaliśmy metody repr dla klasy Point3D i utworzyliśmy instancję my_point jako instancję Point3D, a następnie robimy to ...

wypisz my_point ... możemy zobaczyć to jako wynik ...

Niezbyt ładne, co?

Dlatego definiujemy specjalną metodę repr lub str lub obie, aby uzyskać lepszy wynik.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

Wynik ...

(1, 2, 3) (1, 2, 3)

Ashish Anand
źródło