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:
- że
b
jest instancją klasy A
w przestrzeni nazw __main__
,
- 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) 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'' –