Question

This is probably something stupid I am missing but it has really got me hung up on a larger project (c extension) that I am writing.

Why is print "Hello, World!" passing None and an extra \n to sys.stdout here?

>>> import sys
>>> class StdOutHook:
...     def write(self, text):
...         sys.__stdout__.write("stdout hook received text: %s\n" % repr(text))
... 
>>> class StdErrHook:
...     def write(self, text):
...         sys.__stderr__.write("stderr hook received text: %s\n" % repr(text))
... 
>>> sys.stdout = StdOutHook()
>>> sys.stderr = StdErrHook()
>>> 
>>> def x():
...     print "Hello, World!"
... 
>>> 
>>> print x()
stdout hook received text: 'Hello, World!'
stdout hook received text: '\n'
stdout hook received text: 'None'
stdout hook received text: '\n'
>>> 
Was it helpful?

Solution

print x() prints the return value of x() which is implicitly None

Either replace print "Hello world" with return "Hello world" or replace print x() with x()

OTHER TIPS

Two things:

First, print automatically adds a new line unless you specify otherwise. If you don't want a new line add a comma:

print "Hello, World!",

Second, you are printing the return of the x() function which is None. The function f() is equivalent to this:

def x():
    print "Hello, World!"
    return None

So print x() prints None.

def x():
   print "Hello, World!"

Will execute print and return None - additional newlines are generated by print and None is printed since you wrote print x() :)

If you wish to eliminate the additional newline, write x instead as:

def x():
   sys.stdout.write("Hello, World!")
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top