2011-01-11 17 views
5

Czytałem o repr w języku Python. Zastanawiam się, co jest zastosowanie wyjścia z repr. na przykładKiedy dane wyjściowe repr są przydatne?

class A: 
pass 

repr(A) ='<class __main__.A at 0x6f570>' 

b=A() 
repr(b) = '<__main__.A instance at 0x74d78>' 

Kiedy jeden byłby zainteresowany '<class __main__.A at 0x6f570>' lub '<__main__.A instance at 0x74d78>'?

Odpowiedz

4

Czasami można mieć do czynienia z lub present a byte string takich jak

bob2='bob\xf0\xa4\xad\xa2' 

Jeśli to wydrukować (Ubuntu) można dostać

In [62]: print(bob2) 
bob 

który nie jest bardzo pomocne dla innych próbujących zrozumieć ciąg bajtów. W komentarzach John zwraca uwagę, że w systemie Windows print(bob2) kończy się czymś w rodzaju bob𤭢. Problem polega na tym, że Python wykrywa domyślne kodowanie twojego terminala/konsoli i próbuje dekodować ciąg bajtów zgodnie z tym kodowaniem. Ponieważ Ubuntu i Windows używają różnych domyślnych kodowań (prawdopodobnie odpowiednio utf-8 i cp1252), następują różne wyniki.

Natomiast repr z ciągiem jest jednoznaczna:

In [63]: print(repr(bob2)) 
'bob\xf0\xa4\xad\xa2' 

Kiedy ludzie zadawać pytania tutaj na SO o strunach Python, są one często zadawane pokazać repr napisu więc wiemy na pewno, co ciąg, z którym mają do czynienia.

Ogólnie rzecz biorąc, repr powinno być jednoznacznym ciągiem znaków reprezentującym obiekt. repr(obj) nazywa metodę obiektu obj za pomocą metody. Ponieważ w twoim przykładzie klasa A nie ma własnego sposobu określania adresu klasy i pamięci, nie ma ona własnej metody .

Można zastąpić metodę __repr__, aby podać bardziej istotne informacje.


W przykładzie '<__main__.A instance at 0x74d78>' mówi nam dwa ważne rzeczy:

  1. że b jest instancją klasy A w przestrzeni nazw __main__ ,
  2. i że obiekt znajduje się w pamięci pod adresem 0x74d78.

Możesz na przykład mieć dwa wystąpienia klasy A. Jeśli mają ten sam adres pamięci, to znaczy, że "wskazują" ten sam obiekt. (Uwaga: tę informację można również uzyskać, używając id).

+0

(0) Proszę nie mówić o ciągach bajtów bez wspominania o domniemanym/znanym kodowaniu (1) W rzeczywistości dodawanie wagi do przyczyny do używania repr(), nie każdy otrzymuje ten znak CJK podczas drukowania tego ciągu; w IDLE w Windows, uzyskuje się 'bob𤠢' ... powinien mieć 4 znaki po 'bob' i widzę 4 w IDLE, ale w tym komentarzu SO widzę tylko 3; prawdopodobnie \ xAD jest traktowany jako miękki łącznik. (2) Użyteczne w przypadku ciągów unicode, a nie tylko ciągów bajtowych. Przykład: 'u'bob \ U00024b62'' –

1

Głównym celem repr() jest to, że jest używany w Interaktywnym tłumaczu iw debugerze do formatowania obiektów w formie czytelnej dla człowieka. Podany przykład jest głównie przydatny do celów debugowania.

5

Teoretycznie, repr(obj) powinien wypluć ciąg znaków, tak aby można go było wprowadzić do eval, aby odtworzyć obiekt. Innymi słowy, powinien odtworzyć obiekt.

W praktyce repr jest często "lite" wersją str. str może wydrukować czytelną dla człowieka formę obiektu, podczas gdy repr drukuje informacje takie jak klasa obiektu, zwykle w celu debugowania. Jednak przydatność zależy w dużej mierze od twojej sytuacji i sposobu, w jaki dany obiekt obsługuje repr.

+0

prostu próbowałem go i mam następujący >>> obj = eval (reprezentujący (w)) Traceback (most recent call last): File "", wiersz 1, w Plik "" linia 1 <__ główna __. Instancja o 0x74d78> ^ Błąd składni: nieprawidłowa składnia – shaz

+0

@shaz: Co słychać? To powinno działać na przykład z 'w = 'string''. – nmichaels

+0

w jest instancją klasy A, tj. W = A() – shaz

Powiązane problemy