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

Cam*_*lon 6 python ipython

例如,

python
>> x = 1
>> x
1
Run Code Online (Sandbox Code Playgroud)

我很好奇x返回的方法/功能是什么1.我在问,因为我看到调用print x和简单之间存在差异x.

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

Kev*_*vin 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
Run Code Online (Sandbox Code Playgroud)

在定义__repr____str__为您自己的类定义时,请尝试遵循文档中关于哪个应该更详细和"官方"的建议.

[ __repr__计算]对象的"官方"字符串表示.如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境).
...
[ __str__计算]对象的"非正式"字符串表示.返回值必须是字符串对象.此方法的不同之处在于object.__repr__()不期望__str__()返回有效的Python表达式:可以使用更方便或简洁的表示.


wim*_*wim 5

另一个答案涉及repr普通的 Python REPL,但它忽略了有关 IPython 的答案,IPython 的工作方式完全不同,并且在 REPL 打印方面具有更多功能(和复杂性)。

这是一个差异示例:

# vanilla python:
>>> type([])
<class 'list'>

# in IPython:
>>> type([])
list
Run Code Online (Sandbox Code Playgroud)

IPython 有一个自定义的漂亮打印机和公共钩子,用于在 IPython 中自定义 repr。其中一个钩子是_repr_pretty_(单下划线!),这是一个基本示例:

>>> class Widget:
...     def __repr__(self):
...         "vanilla"
...     def _repr_pretty_(self, p, cycle):
...         p.text("chocolate, strawberry")
...         
>>> Widget()
chocolate, strawberry
Run Code Online (Sandbox Code Playgroud)

有关更多功能,请参阅文档中的“将对象与 IPython 集成”,特别是丰富的显示部分。