LINUX.ORG.RU

Модуль sys странно себя ведёт

 , , ,


0

1

У меня Ubuntu 22.04. Выполняю в консоли такой вот код:

import sys
sys.stdout.write('Hello')

Получаю результат «Hello5». Откуда эта «5» на конце берётся? Это нормально или баг?

В предоставленном вами коде нет ничего, что могло бы привести к выводу «Hello5». Вероятно, происходит что-то еще в вашем окружении или при запуске кода, что приводит к этому результату. В самом коде нет никакой операции или выражения, которые могли бы добавить «5» к строке «Hello».

Если у вас есть другой код или дополнительные детали, которые вы могли бы предоставить, то я с удовольствием помогу вам разобраться в ситуации.

alex1101
()
Ответ на: комментарий от alex1101

возможно, sys.stdout.write возвращает ещё и количество символов?

Да, вы абсолютно правы! Функция sys.stdout.write() возвращает количество записанных символов. Это объясняет, почему вы видите «Hello5».

Когда вы вызываете sys.stdout.write(‘Hello’), функция записывает строку «Hello» в стандартный вывод (обычно это консоль) и затем возвращает количество записанных символов, то есть 5. Вот почему вы видите «Hello5» в консоли.


Сука, тупой)

alex1101
()
Ответ на: комментарий от adn

Почему? В книге «Python Полное руководство» (Кольцов Д. М., 2022) пишется, что данный метод является аналогом print. Print так себя не ведёт - он просто выводит на печать то, что в кавычках, без добавления количества символов … например, тут sys.stdout.write не печатает количество символов.

Desmond_Hume ★★★★★
() автор топика
Ответ на: комментарий от adn

А зачем оно это делает и почему оно это печатает, а не возвращает? Дурь какая то.

P.S. Проверил, если сохранить возврат функции то на вывод не печатает, но всё рано объясните какого хрена возврат функции склеивается с её выхлопом если его явно не сохранять в переменную? Чё за бред? o_O Почему, зачем, доколе. Мне просто логика интересна, почему это вот именно так сделано?

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от alex1101

Коварный IDLE, значит. Изучать питон в IDLE, наверное, не очень хорошая затея. Интересно, такие приколы только в питоне или ещё где-то встречаются: там так работает код, в другом IDE по-другому, в третьем - иначе …

Desmond_Hume ★★★★★
() автор топика
Последнее исправление: Desmond_Hume (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Функция выводит в файл и возвращает значение. Возвращённое значение печатается в консоли IDLE (потому же, почему при наборе 1 Еnter в консоли выведется 1). Вопрос — что будет, если «файл» тоже консоль?

alegz ★★★★
()
Последнее исправление: alegz (всего исправлений: 1)
Ответ на: комментарий от Desmond_Hume

Так и выведи свое хейло. Разработчики старались, делали интерактивный режим удобным для того, чтобы быстро что-то посчитать или проверить. Без лишних print и т.д. А тебе все не нравится. Ты просто не пользуйся им вообще никогда. Создавай файлы и запускай их. А то не дай бог еще про ipython узнаешь.

adn ★★★★
()
Ответ на: комментарий от adn

Ладно уж, я привыкну. Просто когда видишь это первый раз, то шок, конечно … теперь буду знать, что в интерактивном режиме тестить свои приложухи - чревато «интерактивными сюрпризами». Предупреждён - вооружён!

Desmond_Hume ★★★★★
() автор топика
Ответ на: комментарий от Desmond_Hume

Блин, да это для удобства сделано, чтобы в интерактивном режиме не печатать лишних символов. Знать надо, какие методы и функции возврашают что-либо, и либо не удивляться выводу, либо добавлять например «_ = f(x,y,z)», если возвращаемое значение не интересно.

seiken ★★★★★
()
Ответ на: комментарий от Desmond_Hume

Такие приколы случаются всегда когда начинаешь изучать что-то новое и делаешь какие-то странные вещи которые другим людям ещё не приходили в голову. Книжку которая советует юзать IDLE - закопай^W верни обратно в библиотеку.

ei-grad ★★★★★
()