Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Что происходит в интерактивном режиме (>>>) если ввести строку (или идентификатор проинициализированной переменной) и нажать Enter ?

#python


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

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


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

Теперь так:

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


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

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


Ответы

Ответ 1



Как при вызове 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

Ответ 2



В интерактивном режиме используется 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() Для Юникодных строк, в Питоне 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__ напрямую. Эти методы не усиливают возвращаемый тип, в отличии от соответствующих функций. Ссылки Difference between __str__ and __repr__ in Python What is the purpose of __str__ and __repr__ in Python? __repr__ vs repr

Ответ 3



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

Комментариев нет:

Отправить комментарий