Python `print` передает дополнительный текст в sys.stdout? - PullRequest
4 голосов
/ 28 ноября 2011

Это, вероятно, что-то глупое, что я упускаю, но это действительно заставило меня зацикливаться на большом проекте (расширение c), который я пишу.

Почему print "Hello, World!" проходит None идополнительные \n до sys.stdout здесь?

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

Ответы [ 3 ]

7 голосов
/ 28 ноября 2011

print x() печатает возвращаемое значение x(), которое неявно None

Либо заменить print "Hello world" на return "Hello world", либо заменить print x() на x()

3 голосов
/ 28 ноября 2011

Две вещи:

Во-первых, печать автоматически добавляет новую строку, если не указано иное.Если вам не нужна новая строка, добавьте запятую:

print "Hello, World!",

Во-вторых, вы печатаете возврат функции x (), которая равна None.Функция f() эквивалентна этому:

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

Итак print x() печатает None.

1 голос
/ 28 ноября 2011
def x():
   print "Hello, World!"

Выполнит print и вернет None - дополнительные символы новой строки генерируются print и печатается None, поскольку вы написали print x():)

Если вы хотите исключитьдополнительный символ новой строки, напишите x вместо:

def x():
   sys.stdout.write("Hello, World!")
...