我想要什么
在这个例子中,我希望看到unicode字符串而不使用print
:
In [1]: a = u's·A/m'
In [2]: type(a)
Out[2]: str
In [3]: a
Out[3]: 's\xc2\xb7A/m'
In [4]: print a
s·A/m
如何强制字符串__repr__
不显示s\xc2\xb7A/m
而是显示s·A/m
?
用例是什么?
我有一个代表与其单位相关联的数字的类,例如:
class MyNumber(float):
def __new__(cls, ...):
...
def __repr__(self):
return str(self) + str(self.units)
当我在IPython工作时,我想快速查看实例的内容:
>>> a = MyNumber('23.43', ampere=1, second=1, meter=-1)
>>> a
23.43 s·A/m
相反,我得到了一个例外:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 11: ordinal not in range(128)
如果我尝试手动查看__repr__
的内容,我就会知道:
>>>a.__repr__()
23.43 s\xc2\xb7A/m
答案 0 :(得分:1)
不是从__repr__
返回字节字符串,而是返回一个Unicode字符串。
def __repr__(self):
return unicode(self) + self.units.decode('utf-8')
如果self.units
已经是Unicode字符串:
def __repr__(self):
return unicode(self) + self.units
答案 1 :(得分:-1)
您的问题可能来自您的IPython配置。检查编码:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
如果您获得上述ASCII,则可能会遇到unicode字符串的一些问题。
所以试试这个:
>>> reload(sys)
>>> sys.setdefaultencoding('utf8')
它应该有用......
答案 2 :(得分:-2)
这是一个所谓的XY问题。你的第一个问题完全不相关。
相反,你应该
self.units
修复为正确的格式(如果我没有弄错,你使用Python 3?你应该在标签中宣布你的Python主要版本......)或将其转换为类似
的内容class MyNumber(float):
def __repr__(self):
return str(self) + " " + str(self.units)
我的猜测结果是self.units
可能不是str
,而是unicode
对象。然后它的隐式转换可能会失败,默认情况下,ascii
编解码器用于解码。
你应该确保不要混淆原始字符串和unicode字符串。
如果str(self.units)
不起作用,您可能希望将其替换为self.units.decode("utf8")
。
要明确这个过程:
在提示符下键入a
将以某种方式显示repr(a)
的结果。
repr(a)
来电a.__repr__()
,检查其类型(必须为str
)并显示。
我不清楚a
或repr(a)
在a.__repr__()
工作时失败的原因,这就是为什么我一直在询问异常的追溯......