Dano mi do zrozumienia, że wywołanie print obj
wywoła obj.__str__()
, które z kolei zwróci ciąg znaków do drukowania na konsoli. Teraz mam problem z Unicode, w którym nie mogłem drukować żadnych znaków spoza ASCII. Mam typowe "ascii poza zasięgiem".Różnica w języku Python między drukowaniem obj i drukowaniem obj .__ str__() [co najmniej z Unicode?]
Podczas eksperymentowania pracował następuje:
print obj.__str__()
print obj.__repr__()
Z obie funkcje robi dokładnie to samo (__str__()
prostu zwraca self.__repr__()
). Co nie działało:
print obj
Problem wystąpił tylko przy użyciu znaku z zakresu ASCII. Ostateczne rozwiązanie było do następujących __str__()
:
return self.__repr__().encode(sys.stdout.encoding)
Teraz pracuje dla wszystkich części. Moje pytanie brzmi teraz: Gdzie jest różnica? Dlaczego to działa teraz? Dostaję, jeśli nic nie działa, dlaczego to działa teraz. Ale dlaczego tylko górna część działa, a nie dno.
System operacyjny to Windows 7 x64 z domyślnym wierszem poleceń systemu Windows. Zgłoszono również, że kodowanie to cp850
. Jest to bardziej ogólne pytanie do zrozumienia Pythona. Mój problem został już rozwiązany, ale nie jestem w 100% szczęśliwy, głównie dlatego, że teraz wywołanie str(obj)
przyniesie ciąg, który nie jest zakodowany w sposób, w jaki chciałem.
# -*- coding: utf-8 -*-
class Sample(object):
def __init__(self):
self.name = u"üé"
def __repr__(self):
return self.name
def __str__(self):
return self.name
obj = Sample()
print obj.__str__(), obj.__repr__(), obj
Usuń ostatnie obj
i działa. Trzymać go i wywala z
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
Co to wersja Pythona ty biegasz? –
Pokaż minimalny przykład klasy obj z przykładowymi ciągami, które drukujesz. –
Być może szukasz 'obj .__ unicode __()'? –