如何在 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
)并显示它。
我不清楚为什么 a
或 repr(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')
它应该可以工作...
我想要什么
在这个例子中,我想在不使用 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 表示与其单位相关联的数字,例如:
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
)并显示它。
我不清楚为什么 a
或 repr(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')
它应该可以工作...