Оператор Python print обычно печатает repr() своего ввода. Кортежи не являются исключением:
>>> print (1, 2, 3)
(1, 2, 3)
>>> print repr((1, 2, 3))
(1, 2, 3)
Но затем я наткнулся на какое-то странное поведение, в то время как возился с внутренними CPython. Короче говоря: если вы обманываете Python 2 в создании саморегуляционного кортежа, его печать напрямую ведет себя совершенно иначе, чем печать его представлений repr()/str()/unicode().
>>> print outer # refer to the link above
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
... many lines later ...
((((((((((Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError: stack overflow
>>> print repr(outer)
((...),)
>>> print str(outer)
((...),)
>>> print unicode(outer)
((...),)
Так что же делает print? В попытке ответить на этот вопрос сам я упомянул ссылку на язык:
6.6. Оператор
И правила для преобразования строк:
5.2.9. Преобразования строк
Преобразование строк - это список выражений, заключенный в обратном порядке (a.k.a. назад):
string_conversion ::= "`" expression_list "`"
Но включение outer в обратные кавычки имеет тот же результат, что и вызов repr() и друзей. Нет кубиков. Так что, черт возьми, print действительно делает за кулисами?
(Интересно, что поведение "фиксировано" в Python 3: печать саморегуляторного кортежа дает усеченную форму с эллипсией.)