2016-12-26 90 views
4

我正在更新一個愛好應用程序,它是用Ubuntu 14.04上的Python 2.7編寫的,它將json中的鐵路歷史數據存儲起來。我現在用它來處理英國的數據。python str()函數的結果不同於__str __()函數的結果

從法國數據開始時,我遇到了一個困惑我的問題。我有一個類CompaniesCache其實施__str__()。在那個實現裏面,一切都在使用str的。假設我實例化一個CompaniesCache並分配到一個變量companies。當我在IPython2,給出命令print companies,我得到一個錯誤:

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

好吧,這是不奇怪。測試。如預期的那樣,str(companies)重現錯誤。但是,companies.__str__()成功沒有問題,因爲print company.__str__()。這裏有什麼問題?

這裏CompaniesCache對象的__str__方法的代碼:

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 

這是CompaniesCache對象,其中包含在其高速緩存的dict Company對象的代碼。公司對象沒有實現__str __()方法。

+1

請問您可以包含一些代碼嗎? – FlipTack

+2

您的'__str__'方法正在返回一個unicode對象,其中包含非ascii字符。 – user2357112

+1

你可以添加一個字符串樣本嗎? –

回答

0

使用maxpolk answer 我認爲你應該做的是設置你的環境變量

export LC_ALL='en_US.utf8' 

總括而言,我認爲你可以找到你的答案in this post

+0

試過這個,但它沒有改變任何東西。我的環境已經是美國的utf8。 –

4

str不只是調用__str__。除此之外,它驗證返回類型,如果__str__不可用,它將回退到__repr__,並且它會嘗試使用ASCII編解碼器將unicode返回值轉換爲str

您的__str__方法正在返回帶有非ASCII字符的unicode實例。當str嘗試將其轉換爲字符串時,它會失敗,併產生您看到的錯誤。

不要從__str__返回unicode對象。您可以實施__unicode__方法來定義unicode(your_object)的行爲方式,並從__str__返回適當編碼的字節串。

+0

這聽起來不錯!問題是,整個事情只是以英國人的身份開始。這是注入unicode數據的法​​國數據。看來我必須重構應用程序才能使用unicode,並且可能將其移植到python3。 –