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

How to see unicode (utf-8) __repr__ for class in Python?

我想要什么

在这个例子中,我想在不使用 print:

的情况下查看 unicode 字符串
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 表示与其单位相关联的数字,例如:

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 

这就是所谓的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__() 有效,这就是为什么我一直在询问异常的回溯...

不是从 __repr__ 中 return 字节字符串,而是 return Unicode 字符串。

def __repr__(self):
    return unicode(self) + self.units.decode('utf-8')

如果self.units已经是一个Unicode字符串:

def __repr__(self):
    return unicode(self) + self.units

您的问题可能来自您的 IPython 配置。检查编码:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

如果您按上述方式获得 ASCII,您可能会遇到一些 unicode 字符串问题。

所以试试这个:

>>> reload(sys)
>>> sys.setdefaultencoding('utf8')

它应该可以工作...