例如,
python
>> x = 1
>> x
1
我很好奇x
上的哪种方法/功能正在返回1.我问,因为我看到调用print x
和x
之间存在差异。
同样,有没有办法指定所谓的内容?这种配置是否存在于IPython中?
答案 0 :(得分:7)
当您在REPL中以这种方式检查对象时,它会调用对象的__repr__
方法。相比之下,print
使用对象的__str__
方法。例如:
>>> class Widget:
... def __repr__(self):
... return "repr of a Widget"
... def __str__(self):
... return "str of a Widget"
...
>>> x = Widget()
>>> x
repr of a Widget
>>> print(x)
str of a Widget
>>> print([x,2,3])
[repr of a Widget, 2, 3]
>>> print(repr(x))
repr of a Widget
>>> print(str(x))
str of a Widget
为您自己的课程定义__repr__
和__str__
时,请尝试遵循文档中有关哪一个应该更详细的建议以及"官方"。
[
__repr__
计算]对象的“官方”字符串表示。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。
...
[__str__
计算]对象的“非正式”字符串表示。返回值必须是字符串对象。此方法与object.__repr__()
的不同之处在于,不期望__str__()
返回有效的Python表达式:可以使用更方便或简洁的表示。
答案 1 :(得分:2)
其他答案使用的是香草Python REPL中的repr
,但忽略了有关IPython的答案,该问题works quite differently并具有关于REPL打印的更多功能(和复杂性)。
以下是示例差异:
# vanilla python:
>>> type([])
<class 'list'>
# in IPython:
>>> type([])
list
IPython具有custom pretty printer和公共钩子,用于在IPython中自定义repr。 _repr_pretty_
(单个下划线!)就是一个这样的钩子,这是一个基本示例:
>>> class Widget:
... def __repr__(self):
... "vanilla"
... def _repr_pretty_(self, p, cycle):
... p.text("chocolate, strawberry")
...
>>> Widget()
chocolate, strawberry
有关更多功能,请参阅文档中的“ 将对象与IPython集成”,尤其是Rich display部分。