2012-08-25 17 views
27

Tengo un script que crea salida con sys.stdout.write() y sys.stderr.write(). Recientemente publiqué un par de preguntas sobre otros aspectos del guión y me di cuenta de que las personas que publican respuestas parecen preferir print('some text', file=sys.stdout). Mi principal preocupación con la salida es simplemente que puede ser canalizada por el shell, ya sea en un archivo o como entrada a otro programa. ¿Puede alguien explicar (o dirigirme a una explicación existente) las diferencias entre print() y sys.stdout.write, los casos en que cada uno debe ser utilizado y el racional para esas convenciones?print() vs sys.stdout.write(): ¿y por qué?

+0

duplicado posible de [Python - La diferencia entre sys.stdout.write e imprimir] (https: //stackoverflow.com/questions/3263672/python-the-difference-between-sys-stdout-write-and-print) –

Respuesta

37

"Por favor alguien puede explicar (o me dirigieron a una explicación existente) las diferencias entre la impresión() y sys.stdout.write, los casos en los que cada uno debe ser utilizado y los racionales de esos convenios? "

Bueno, supongo que el silencio que escucha con respecto a la función print() de Python3, se debe a que prácticamente solo existe una diferencia: Uso. permítanme citar PEP-3105: [1]

La firma de print() es:

definición de impresión (* args, sep ='', final = '\ n', file = None)

una llamada como:

de impresión (a, b, c, file = sys.stderr)

será equivalente al de hoy:

de impresión >> sys.stderr, a, b, c

mientras que la SEP y final argumentos opcionales especifican lo que se imprime entre y después de los argumentos, respectivamente .

Se eliminará la función de espacio suave (un atributo semisecreto en los archivos que se utilizan actualmente para indicar si se debe insertar un espacio antes del primer elemento). Por lo tanto, no habrá una traducción directa de hoy:

de impresión "a", la impresión

que no se imprimirá un espacio entre la "a" y la nueva línea.

Así, citando la discusión de Guido van Rossum sobre el problema en 2005 [1]: Existe una clara no linealidad en la facilidad de uso de la impresión una vez que decide que no desea tener espacios entre los elementos; o tiene que cambiar a usar sys.stdout.write(), o tiene que recoger todos los elementos en una cadena.Esto no es una simple transformación, tenga en cuenta lo que se necesita para deshacerse de los espacios antes de las comas en este ejemplo sencillo:

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

si era una función incorporada, después de haber incorporado un La función complementaria que hizo algo similar sin insertar espacios y agregar una nueva línea sería lo lógico (o agregar parámetros de palabras clave para controlar ese comportamiento, pero prefiero una segunda función); pero con sólo de impresión en su estado actual, habría que cambiar a algo así como

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

o

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

ninguno de los cuales es muy atractivo. (Y no me diga que los espacios no son gran cosa - que no están en esta ejemplo, pero lo son en otras situaciones.)


Buena pregunta para un domingo por la mañana por el carril de la memoria ; ¿Por qué esta aparente redundancia? Debido a que es pythonically más correcta de escribir código de nivel superior:

séptimo Zen de Python: "La legibilidad cuenta"

Cuestiones relacionadas