Windows CMD добавляет случайное число в конце напечатанной строки с помощью sys.stdout из python - PullRequest
3 голосов
/ 11 марта 2019

Я написал простое заявление sys.stdout.write в консоли 64-разрядной операционной системы Windows 10.

Microsoft Windows [Version 10.0.17134.590]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\user>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.write('x')
x1
>>> sys.stdout.write('try')
try3
>>> sys.stdout.write('fooo')
fooo4

Установленная версия Python: 3.7.2.

Ответы [ 2 ]

7 голосов
/ 11 марта 2019

Число не случайно; это количество написанных символов. Поскольку вы находитесь в интерактивном Python, возвращаемое значение оператора также печатается. sys.stdout.write (или запись в файл в целом) возвращает количество записанных символов.

Поэтому, когда вы делаете что-то вроде sys.stdout.write('fooo'), сначала печатается fooo, затем печатается возвращаемое значение (4).

sys.stdout.write можно поиздеваться так:

def mywrite(s):
    print(s, end='')
    return len(s)

В интерактиве:

>>> def mywrite(s):
...     print(s, end='')
...     return len(s)
...
>>> mywrite('x')
x1
>>> mywrite('try')
try3
>>> mywrite('fooo')
fooo4
0 голосов
/ 11 марта 2019

REPL всегда будет печатать возвращаемое значение (в вашем случае количество записанных символов в STDOUT) функции, вызываемой, если вы ее не захватываете.Если вы не хотите, чтобы он печатался, вы всегда можете использовать временную переменную для хранения возвращаемого значения во временном / временном переменном:

>>> _ = sys.stdout.write('foobar\n')
foobar
>>>

Обратите внимание на добавленную новую строку в конце - это потому, чтоон не будет добавлен автоматически, поэтому без него ваше следующее приглашение REPL начнется сразу после foobar вместо новой строки.

Или, вы знаете, вы можете просто использовать print()*Функция 1009 *, которая при своих настройках по умолчанию будет делать почти то же самое, вместо того, чтобы вам приходилось иметь дело непосредственно с потоком STDOUT.

...