Python `print` passing extra text to sys.stdout?

浪子不回头ぞ 提交于 2019-12-10 14:09:06

问题


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'
>>> 

回答1:


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()




回答2:


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.




回答3:


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!")


来源:https://stackoverflow.com/questions/8288717/python-print-passing-extra-text-to-sys-stdout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!