2016-05-05 24 views
6

Stavo solo giocando con lo sys.stdout.write() in una console Python quando ho notato che questo dà strani output.Uscita strana quando si scrive su stdout in console

Per ogni chiamata write(), il numero di caratteri scritti, passati alla funzione, viene aggiunto all'output.

>>> sys.stdout.write('foo bar') per esempio risultati in foo bar7 in stampa.

Anche il passaggio di una stringa vuota determina un'uscita di 0.

Questo accade solo in una console Python, ma non quando si esegue un file con le stesse istruzioni. Più interessante accade solo per Python 3, ma non per Python 2.

Anche se questo non è un problema per me in quanto si verifica solo in una console, mi chiedo davvero perché si comporta in questo modo.

La mia versione di Python è 3.5.1 in Ubuntu 15.10.

risposta

8

Oltre a scrivere la stringa data, write sarà anche restituire il numero di caratteri (in realtà, byte, cercano sys.stdout.write('へllö')) come console pitone stampa il valore di ritorno di ciascuna espressione stdout, il valore restituito viene aggiunto al reale valore stampato.

Perché write non aggiunge nessuna nuova riga, sembra la stessa stringa.

Lo si può verificare con uno script che contiene questo: uscita

#!/usr/bin/python 
import sys 

ret = sys.stdout.write("Greetings, human!\n") 
print("return value: <{}>".format(ret)) 

Questo script dovrebbe una volta eseguito:

Greetings, human! 
return value: <18> 

Questo comportamento è menzionato nella documentazione here.

+0

Interessante. Quindi 'a = sys.stdout.write ('foo')' dovrebbe rivelare questo comportamento che cosa effettivamente fa anche. 'a' è impostato su' 3' in questo caso e il numero non si aggiunge più all'output. Ma mi chiedo ancora perché questo avvenga solo in Python 3. Anche in questo documento non trovo alcuna menzione nel documento. – critop

+0

Ho aggiunto uno script che mostra il risultato, per rendere le cose più chiare. Non ho davvero letto i documenti per questo, l'ho appena assunto perché succede in un bel po 'di lingue e l'ho testato. Cercherò un PEP che lo menzioni e torno qui se lo faccio. – Noctua

+2

Solo per aggiungere, conta i caratteri Unicode 'sys.stdout.write ('へ llö')' restituisce "へ llö4" – C14L