Когда я нахожусь в консоли Python или IPython, что вызывается, когда я возвращаю вывод?

Например,

python
>> x = 1
>> x
1

Мне интересно, какой метод/функция на x возвращается 1. Я спрашиваю, потому что вижу разницу между вызовом print x и просто x.

Similary, есть способ указать, что называется? Эта конфигурация существует в IPython?

Ответ 1

Когда вы проверяете объект таким образом в 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__() что __str__() вернет правильное выражение Python: можно использовать более удобное или краткое представление.

Ответ 2

Другой ответ обращается к repr в обычном Python REPL, но он не ответил об IPython, который работает совершенно по-другому и имеет гораздо больше возможностей (и сложностей) в отношении печати REPL.

Вот пример несоответствия:

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

# in IPython:
>>> type([])
list

IPython имеет собственный симпатичный принтер и публичные хуки для настройки repr в IPython. Одним из таких хуков является _repr_pretty_ (одиночные подчеркивания!) И вот базовый пример:

>>> class Widget:
...     def __repr__(self):
...         "vanilla"
...     def _repr_pretty_(self, p, cycle):
...         p.text("chocolate, strawberry")
...         
>>> Widget()
chocolate, strawberry

Дополнительные сведения см. В разделе "Интеграция ваших объектов с IPython" в документации, в частности в разделе " Богатое отображение ".