python str()函数结果与__str __()函数的结果不同

时间:2016-12-26 19:16:51

标签: python python-2.7

我正在更新一个爱好应用程序,用Ubuntu 14.04上的Python 2.7编写,用于存储json中的铁路历史数据。我现在用它来处理英国数据。

从法国数据开始,我遇到了一个令我困惑的问题。我有一个实现CompaniesCache的课程__str__()。在该实现中,一切都在使用str。假设我实例化CompaniesCache并分配给变量companies。当我在IPython2中给出命令print companies时,我收到一个错误:

  

UnicodeEncodeError:'ascii'编解码器无法编码位置184中的字符u'\ xe0':序数不在范围内(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对象。 Company对象不实现__str __()方法。

2 个答案:

答案 0 :(得分:4)

str并不只是致电__str__。除其他外,它验证了返回类型,如果__repr__不可用,它会回退到__str__,而会尝试将unicode返回值转换为{{ 1}} 使用ASCII编解码器。

您的str方法正在返回带有非ASCII字符的__str__实例。当unicode尝试将其转换为字节字符串时,它会失败,从而产生您正在看到的错误。

不要从str返回unicode个对象。您可以实现__str__方法来定义__unicode__的行为方式,并从unicode(your_object)返回适当编码的字节串。

答案 1 :(得分:0)

使用maxpolk answer 我认为您应该做的就是将环境变量设置为

export LC_ALL='en_US.utf8'

我认为你可以找到答案in this post