python str()函数的结果不同于__str __()函数的结果
我正在更新一个爱好应用程序,它是用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 __()方法。
试过这个,但它没有改变任何东西。我的环境已经是美国的utf8。 –
str
不只是调用__str__
。除此之外,它验证返回类型,如果__str__
不可用,它将回退到__repr__
,并且它会尝试使用ASCII编解码器将unicode
返回值转换为str
。
您的__str__
方法正在返回带有非ASCII字符的unicode
实例。当str
尝试将其转换为字符串时,它会失败,并产生您看到的错误。
不要从__str__
返回unicode
对象。您可以实施__unicode__
方法来定义unicode(your_object)
的行为方式,并从__str__
返回适当编码的字节串。
这听起来不错!问题是,整个事情只是以英国人的身份开始。这是注入unicode数据的法国数据。看来我必须重构应用程序才能使用unicode,并且可能将其移植到python3。 –
请问您可以包含一些代码吗? – FlipTack
您的'__str__'方法正在返回一个unicode对象,其中包含非ascii字符。 – user2357112
你可以添加一个字符串样本吗? –