如何在Python中查看类的unicode(utf-8)__repr__?

时间:2015-12-04 16:15:48

标签: python string python-2.7 unicode repr

我想要什么

在这个例子中,我希望看到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 

3 个答案:

答案 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并显示。

我不清楚arepr(a)a.__repr__()工作时失败的原因,这就是为什么我一直在询问异常的追溯......