2016-12-26 79 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。 –