2016-12-26 2 views
4

Ich aktualisiere eine Hobby-App, geschrieben in Python 2.7 auf Ubuntu 14.04, die Eisenbahngeschichtsdaten in JSON speichert. Ich habe es bis jetzt benutzt, um an britischen Daten zu arbeiten.Python str() Funktion Ergebnis unterscheidet sich von __str __() Funktion Ergebnis

Als ich mit französischen Daten anfing, stieß ich auf ein Problem, das mich verwirrt. Ich habe eine Klasse CompaniesCache, die __str__() implementiert. Innerhalb dieser Implementierung verwendet alles str. Angenommen, ich instanziiere eine CompaniesCache und weise sie in eine Variable companies. Als ich, in IPython2, geben Sie den Befehl print companies, ich einen Fehler:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 184: ordinal not in range(128)".

In Ordnung, das ist nicht seltsam. Testen. str(companies) reproduziert den Fehler wie erwartet. Aber companies.__str__() gelingt ohne Probleme, ebenso wie print company.__str__(). Was ist hier falsch ?

Hier ist der Code der __str__ Methode des CompaniesCache Objekts:

class CompaniesCache(object):              
    def __init__(self, railrefdatapath):  
     self.cache = restoreCompanies(railrefdatapath)            

    def __getitem__(self, compcode):                      
     return self.cache[compcode.upper()]                    

    def __str__(self):                 
     s = ''                    
     for k in sorted(self.cache.keys()):                    
      s += '\n%s: %s' % (k, self[k].title)                 
     return s 

Dies ist der Code für das CompaniesCache Objekt, das Unternehmen Objekte in seinem Cache dict enthält. Das Company-Objekt implementiert die __str __() -Methode nicht.

+1

Könnten Sie bitte etwas von Ihrem Code einbeziehen? – FlipTack

+2

Ihre Methode '__str__' gibt ein 'Unicode'-Objekt mit nicht-ASCII-Zeichen zurück. – user2357112

+1

Können Sie ein Beispiel einer Zeichenfolge hinzufügen? –

Antwort

0

Mit maxpolk answer denke ich, alles, was Sie tun sollten Setup Variable

Ihre Umgebung ist
export LC_ALL='en_US.utf8' 

Alles in allem denke ich, Sie Ihre Antwort finden in this post

+0

Versucht dies, aber es ändert nichts. Meine Umgebung ist bereits US utf8. –

4

str nicht nur __str__ nennen. Unter anderem validiert es den Rückgabetyp, es fällt auf __repr__ zurück, wenn __str__ nicht verfügbar ist, und versucht, unicode Rückgabewerte zu str mit dem ASCII-Codec zu konvertieren.

Ihre __str__-Methode gibt eine unicode-Instanz mit Nicht-ASCII-Zeichen zurück. Wenn str versucht, das zu einem bytestring zu konvertieren, schlägt es fehl und erzeugt den Fehler, den Sie sehen.

Geben Sie kein Objekt unicode von __str__ zurück. Sie können eine -Methode implementieren, um zu definieren, wie sich unicode(your_object) verhält, und einen entsprechend codierten Byte-String von __str__ zurückgeben.

+0

Das klingt gut! Das Problem ist, dass das Ganze nur als britisch begann. Es sind die französischen Daten, die Unicode-Daten injizieren. Es scheint, dass ich die App so umgestalten muss, dass sie nur mit Unicode funktioniert und sie möglicherweise nach python3 portiert. –

Verwandte Themen