Оператор 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: печать саморегуляторного кортежа дает усеченную форму с эллипсией.)