3

Просто набираем строку с последующим нажатием Enter:

>>> r'hello\"world'
'hello\\"world'

Получил не то, что ожидал. Я думал, что должна вызваться функция print(r'hello\"world') и распечатать строку hello\"world

Теперь так:

>>> print(r'hello\"world')
hello\"world

Получил то, что ожидал.

Что происходит в интерактивном режиме(>>>) после ввода строки и нажатия на Enter?

pynista
  • 1,162

3 Answers3

4

Как при вызове print, так и при выводе в интерактивном режиме Python преобразует выражение в строку и выводит её на экран. Различия заключаются в том, что при этом вызываются различные методы преобразования. Если вы имеете понятие об ООП, то вот Вам небольшой пример:

class My:
    def __str__(self):
        return '__str__: Вызывается для print'
    def __repr__(self):
        return '__repr__: Вызывается в интерактивном режиме'

obj = My()
print(obj)

После запуска выведет: __str__: Вызывается для print И далее, если в интерактивном режиме ввести сам объект:

>>> obj
__repr__: Вызывается в интерактивном режиме

И __repr__, и __str__ возвращают строку, которая попадает на экран. И так происходит со всеми типами данных, в том числе и с Вашей строкой.

Таким образом:

>>> a = r'hello\"world'
>>> a #равносильно вызову print(a.__repr__())
'hello\\"world'
>>> print(a) #равносильно вызову print(a.__str__())
hello\"world
3

В интерактивном режиме используется sys.displayhook, который по умолчанию среди других вещей вызывает repr(obj):

def displayhook(value):
    if value is None:
        return
    # Set '_' to None to avoid recursion
    builtins._ = None
    text = repr(value)
    try:
        sys.stdout.write(text)
    except UnicodeEncodeError:
        bytes = text.encode(sys.stdout.encoding, 'backslashreplace')
        if hasattr(sys.stdout, 'buffer'):
            sys.stdout.buffer.write(bytes)
        else:
            text = bytes.decode(sys.stdout.encoding, 'strict')
            sys.stdout.write(text)
    sys.stdout.write("\n")
    builtins._ = value

Назначение repr(obj) получить однозначное текстовое представление объекта (полезно для отладки). Идеально, eval(repr(obj)) == obj, например:

>>> import datetime
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 7, 28, 17, 24, 57, 111636)

repr для datetime объекта позволяет воспроизвести его точно.

print(obj) может вызывать str(obj). Назначение str(obj) получить читаемое текстовое представление для объекта:

>>> print(datetime.datetime.utcnow())
2015-07-28 17:24:57.111636

str, repr встроенные функции могут вызывать __str__, __repr__ методы, чтобы реализовать нестандартное поведение. Cтандартное поведение repr(obj) не очень полезно:

>>> object()
<object object at 0x7fe8a7a560f0>

Для Юникодных строк, в Питоне 2 существует __unicode__ метод:

>>> class C:
...   def __str__(self):
...       return "str"
...   def __repr__(self):
...       return "repr"
...   def __unicode__(self):
...       return u"unicode"
... 
>>> C()
repr
>>> print(C())
str
>>> u"%s" % C()
u'unicode'

Если __str__, __unicode__ не определены, то используется repr() функция:

>>> class NoStr:
...    def __repr__(self):
...        return "repr"
... 
>>> NoStr()
repr
>>> print(NoStr())
repr
>>> u"%s" % NoStr()
u'repr'

Не следует вызывать __str__, __repr__ напрямую. Эти методы не усиливают возвращаемый тип, в отличии от соответствующих функций.

Ссылки

jfs
  • 52,361
0

После ввода строки и нажатия на Enter выполняется тот код, который вы ввели. Почему вы решили, что в первом случае должна вызваться функция print?

zzashpaupat
  • 1,429
  • Ну вы сами смотрите: мы ввели r'hello"world', а получили 'hello\"world'. Не отобразилось же r'hello"world'. Значит, должно быть, какие-то преобразования все-таки выполнялись – pynista Jul 28 '15 at 07:59
  • 'hello\\"world' - это то, как интерпретатор представляет эту строку. А функция print обеспечивает дружественный вывод. – zzashpaupat Jul 28 '15 at 08:04
  • Рекомендую прочитать главу 7 "Строки" из книги Марка Лутца "Изучаем Python". А лучше всего - всю книгу, много полезного оттуда можно почерпнуть. – zzashpaupat Jul 28 '15 at 08:06