1

我想要什么

在这个例子中,我想在不使用的情况下查看 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 
4

3 回答 3

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
于 2015-12-04T18:05:46.290 回答
-1

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

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

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

所以试试这个:

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

它应该工作......

于 2015-12-06T19:28:30.617 回答
-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__(),这就是为什么我一直在询问异常的回溯......

于 2015-12-04T17:05:45.030 回答