print()vs sys.stdout.write():哪个和为什么?

时间:2012-08-25 04:03:42

标签: python python-3.x

我有一个脚本可以使用sys.stdout.write()sys.stderr.write()创建输出。最近我发布了一些关于脚本其他方面的问题,我注意到发布答案的人似乎更喜欢print('some text', file=sys.stdout)。我对输出的主要关注是它可以被shell传输到文件或作为另一个程序的输入。有人可以解释(或指导我现有的解释)print()sys.stdout.write之间的差异,每个应该使用的案例以及这些惯例的合理性吗?

1 个答案:

答案 0 :(得分:42)

有人可以解释(或指示我现有的解释)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功能(当前用于告知打印的文件的半秘密属性是否在第一个项目之前插入空格)。因此,今天不会有直接翻译:

  

打印“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个禅:“可读性很重要”