Подтвердить что ты не робот

Print() vs sys.stdout.write(): что и почему?

У меня есть script, который создает выходные данные с sys.stdout.write() и sys.stderr.write(). Недавно я опубликовал пару вопросов о других аспектах script, и я заметил, что люди, отправляющие ответы, предпочитают print('some text', file=sys.stdout). Моя основная проблема с выходом состоит в том, что он может быть передан оболочкой оболочкой либо в файл, либо как вход в другую программу. Может ли кто-нибудь объяснить (или направить меня к существующему объяснению) различия между print() и sys.stdout.write, случаи, в которых каждый должен использоваться, и рациональное для этих соглашений?

4b9b3361

Ответ 1

"Кто-то может объяснить (или направить меня к существующему объяснению) различия между print() и sys.stdout.write, случаи, в которых каждый должен использоваться, и рациональное для тех конвенции?"

Ну, я думаю, что тишина, которую вы слышите относительно функции print() Python3, заключается в том, что практически существует только одно отличие: Использование. Позвольте мне процитировать PEP-3105: [1]

Подписи для print():

def print (* args, sep = '', end = '\n', file = None)

Вызов типа:

print (a, b, c, file = sys.stderr)

будет эквивалентен сегодняшнему:

print → sys.stderr, a, b, c

в то время как необязательные аргументы sep и end указывают, что напечатано между аргументами и после них соответственно.

Функция мягкого пространства (полусекретный атрибут в файлах, используемых в настоящее время, чтобы сказать, будет ли вставка пробела перед первым элементом) будет удалена. Поэтому для сегодняшнего не будет прямого перевода:

напечатать "a", напечатать

который не будет печатать пробел между "a" и новой строкой.

Итак, цитируя дискуссию о проблеме в Guido van Rossum в 2005 году [1]: существует четкая нелинейность в печати когда вы решите, что вы не хотите иметь пробелы между пунктами; вам нужно либо переключиться на использование sys.stdout.write(), либо вам нужно собрать все элементы в строке. Это не простое преобразование, рассмотрим, что нужно, чтобы избавиться от пробелов перед запятыми в этом простом примере:

print "x =", x, ", y =", y, ", z =", z

Если бы это была встроенная функция, встроенная функция компаньона, которая делала подобную вещь без вставки пробелов и добавления новой строки, была бы логичной задачей (или добавлением параметров ключевого слова для управления этим поведением, но я предпочитают вторую функцию); но только с напечатайте, пока он стоит, вам нужно переключиться на что-то вроде

print "x = " + str(x) + ", y = " + str(x) + ", z = " + str(z)

или

print "x = %s, y = %s, z = %s" % (x, y, z)

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


Хороший вопрос для воскресного утреннего переулка памяти; Почему эта очевидная избыточность? Поскольку питонно более корректно писать код более высокого уровня:

7-й Zen python: "Чтение счетчиков"