print()和sys.stdout.write(): 选择哪个以及为什么?

37

我有一个脚本,使用 sys.stdout.write()sys.stderr.write() 创建输出。最近我发布了几个关于脚本的其他方面的问题,并且我注意到回答问题的人似乎更喜欢使用 print('some text', file=sys.stdout)。我的主要关注点是输出可以通过 shell 进行管道传输,可以输出到文件或作为另一个程序的输入。能否有人解释 (或指引我到现有的解释) print()sys.stdout.write 之间的差异,每种情况下应该使用哪种方法,以及这些约定的理由?


1
可能是Python - sys.stdout.write和print的区别的重复问题。 - cs95
1个回答

54
"有谁能解释一下(print()和sys.stdout.write的区别以及在哪种情况下应该使用每个函数并解释这些惯例的理由吗?"

我想你听到的关于Python3的print()函数的沉默,实际上只有一个区别:用法。让我引用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可选参数指定了它们之间和之后打印的内容。

softspace特性(文件上的半保密属性,目前用于告诉print是否在第一项前插入空格)将被删除。因此,今天这个语句的直接翻译:

print "a", print

将不会在"a"和换行符之间打印空格。

因此,引用Guido van Rossum在2005年关于这个问题的讨论 [1]:

一旦你决定不想在项目之间放置空格,print易用性上存在明显的非线性;你要么必须切换到使用sys.stdout.write(),要么必须将所有项目收集到一个字符串中。这不是一个简单的转换,考虑一下在这个简单的例子中消除逗号前的空格需要做什么:

print "x =", x, ", y =", y, ", z =", z
如果它是一个内置函数,那么有一个内置的伴随函数来做类似的事情而没有插入空格和添加换行符将是合乎逻辑的(或者添加关键字参数来控制这种行为;但我更喜欢第二个函数);但是只有现有的print函数,你需要切换到类似于下面的东西。
print "x = " + str(x) + ", y = " + str(x) + ", z = " + str(z)
print "x = %s, y = %s, z = %s" % (x, y, z)

两者都不是很吸引人。(而且不要告诉我空格不重要——它们在其他情况下确实很重要。)


这是一个值得回忆的周日早晨好问题;为什么有这种表面上的冗余?因为更符合Python风格的编写高级代码:

Python第七禅则:“可读性很重要”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接