例如,
python
>> x = 1
>> x
1
Run Code Online (Sandbox Code Playgroud)
我很好奇x返回的方法/功能是什么1.我在问,因为我看到调用print x和简单之间存在差异x.
同样,有没有办法指定所谓的内容?IPython中是否存在此配置?
在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表达式:可以使用更方便或简洁的表示.
另一个答案涉及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 集成”,特别是丰富的显示部分。