我正在更新一个爱好应用程序,用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 __()方法。
答案 0 :(得分:4)
str
并不只是致电__str__
。除其他外,它验证了返回类型,如果__repr__
不可用,它会回退到__str__
,而会尝试将unicode
返回值转换为{{ 1}} 使用ASCII编解码器。
您的str
方法正在返回带有非ASCII字符的__str__
实例。当unicode
尝试将其转换为字节字符串时,它会失败,从而产生您正在看到的错误。
不要从str
返回unicode
个对象。您可以实现__str__
方法来定义__unicode__
的行为方式,并从unicode(your_object)
返回适当编码的字节串。
答案 1 :(得分:0)