当我在Python或IPython控制台时,当我返回输出时调用什么?

时间:2015-02-03 16:38:42

标签: python ipython

例如,

python
>> x = 1
>> x
1

我很好奇x上的哪种方法/功能正在返回1.我问,因为我看到调用print xx之间存在差异。

同样,有没有办法指定所谓的内容?这种配置是否存在于IPython中?

2 个答案:

答案 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部分。