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