【发布时间】:2012-07-04 06:59:02
【问题描述】:
我了解到调用print obj 会调用obj.__str__(),而obj.__str__() 又会返回一个字符串以打印到控制台。现在我遇到了一个 Unicode 问题,我无法打印任何非 ascii 字符。我得到了典型的“ascii 超出范围”的东西。
在试验以下工作时:
print obj.__str__()
print obj.__repr__()
两个函数的作用完全相同(__str__() 只返回self.__repr__())。什么不起作用:
print obj
问题仅在使用超出 ascii 范围的字符时出现。最终的解决方案是__str__()中的以下内容:
return self.__repr__().encode(sys.stdout.encoding)
现在它适用于所有部分。我现在的问题是:区别在哪里?为什么它现在有效?如果没有任何效果,我会得到,为什么现在可以使用。但是为什么只有顶部起作用,底部不起作用。
操作系统是带有默认 Windows 命令提示符的 Windows 7 x64。据报道编码为cp850。这更像是一个理解 python 的一般性问题。我的问题已经解决了,但我并不是 100% 满意,主要是因为现在调用 str(obj) 会产生一个未按照我想要的方式编码的字符串。
# -*- coding: utf-8 -*-
class Sample(object):
def __init__(self):
self.name = u"üé"
def __repr__(self):
return self.name
def __str__(self):
return self.name
obj = Sample()
print obj.__str__(), obj.__repr__(), obj
删除最后一个obj 即可。保留它,它会崩溃
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
【问题讨论】:
-
你运行的是什么 Python 版本?
-
显示 obj 类的最小示例,其中包含您打印的字符串示例。
-
您是否在寻找
obj.__unicode__()? -
您使用的是哪个版本的 Python?
-
旁白:您可能不应该从对象外部调用
__functions__。请改用str(obj)和repr(obj)。