sys.stdout question

C

chris patton

import sys.... things = []
.... def write(self, string):
.... self.things.append(string)
....['This is a string.', '\n', 'This is another string.', '\n']

Where are the newline characters coming from?
 
S

Steve Holden

chris said:
... things = []
... def write(self, string):
... self.things.append(string)
...

['This is a string.', '\n', 'This is another string.', '\n']

Where are the newline characters coming from?
The print statement automatically inserts a newline at the end of its
output unless the statement ends in a comma. It also puts a space
between the comma-separated items.

regards
Steve
 
M

M.E.Farmer

Print is the culprit here. Note item 2. 6.6 The print statement



print_stmt ::= "print" ( [expression[1] ("," expression[2])*
[","]]
| ">>" expression[3] [("," expression[4])+ [","]] )

Download entire grammar as text.[5]

print evaluates each expression in turn and writes the resulting
object
to standard output (see below). If an object is not a string, it is
first converted to a string using the rules for string conversions.
The
(resulting or original) string is then written. A space is written
before each object is (converted and) written, unless the output
system
believes it is positioned at the beginning of a line. This is the
case
(1) when no characters have yet been written to standard output, (2)
when the last character written to standard output is "\n", or (3)
when
the last write operation on standard output was not a print
statement.
(In some cases it may be functional to write an empty string to
standard
output for this reason.) Note: Objects which act like file objects
but
which are not the built-in file objects often do not properly emulate
this aspect of the file object's behavior, so it is best not to rely
on
this.

A "\n" character is written at the end, unless the print statement
ends
with a comma. This is the only action if the statement contains just
the
keyword print.

Standard output is defined as the file object named stdout in the
built-in module sys. If no such object exists, or if it does not have
a
write() method, a RuntimeError exception is raised.

print also has an extended form, defined by the second portion of the
syntax described above. This form is sometimes referred to as ``print
chevron.'' In this form, the first expression after the >> must
evaluate
to a ``file-like'' object, specifically an object that has a write()
method as described above. With this extended form, the subsequent
expressions are printed to this file object. If the first expression
evaluates to None, then sys.stdout is used as the file for output.

hth,
M.E.Farmer
 
C

chris patton

I tried adding the comma at the end
print 'hello',
It still added that extra character.
 
M

M.E.Farmer

Save your script and run that from a commandline or import it with your
python shell.
['this is a string.', ' ', 'This is another string.']
You are seeing a side effect of the interactive shell.
['this is a string.', '\n', 'This is another string.','\n']
It would be hard to get to the next prompt after a print "dsfdfdssd",
if the shell didn't add the \n to get it there.
Also note most shells use repr or str behind the scenes for output to
sys.stdout sys.stderr..... pass
....'<function g at 0x0077AB88>'
M.E.Farmer
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,237
Messages
2,571,190
Members
47,827
Latest member
wyton

Latest Threads

Top