salto - tablas python ejemplos
Tres formas de imprimir en Python: ¿cuándo usar cada una? (3)
Según Tim Peters , "debería haber una, y preferiblemente solo una, forma obvia de hacerlo". En Python, parece haber tres formas de imprimir información:
print(''Hello World'', end='''')
sys.stdout.write(''Hello World'')
os.write(1, b''Hello World'')
Pregunta: ¿Existen políticas de mejores prácticas que establezcan cuándo debe usarse cada uno de estos tres métodos diferentes de impresión en un programa?
Para mí, imprimir es la forma correcta de imprimir en stdout, pero:
Existe una buena razón por la cual sys.stdout.write existe: Imagine una clase que genera algo de salida de texto y desea hacer que escriba en stdout y archivo en disco o en una cadena. Idealmente, la clase no debería importar qué tipo de salida está escribiendo. A la clase se le puede dar simplemente un objeto de archivo, y siempre que ese objeto sea compatible con el método de escritura, la clase puede usar el método de escritura para generar el texto.
Tenga en cuenta que la afirmación de Tim es perfectamente correcta: solo hay una forma obvia de hacerlo: print()
. Las otras dos posibilidades que mencionas tienen diferentes objetivos.
Si queremos resumir los objetivos de las tres alternativas:
print
es la función de alto nivel que le permite escribir algo en stdout (u otro archivo). Proporciona una API sencilla y legible, con algunas opciones de lujo sobre cómo se separan los elementos individuales, si desea agregar o no un terminador, etc. Esto es lo que desea hacer la mayoría del tiempo.sys.stdout.write
es solo un método de los objetos de archivo. Entonces, el verdadero objetivo desys.stdout
es que puedes pasarlo como si fuera cualquier otro archivo. Esto es útil cuando tiene que tratar con una función que está esperando un archivo y desea que imprima el texto directamente en stdout.En otras palabras, no deberías usar
sys.stdout.write
. Simplemente pasasys.stdout
al código que espera un archivo.Nota: en python2 hubo algunas situaciones en las que el uso de la sentencia de
print
produjo un código peor que el de llamar asys.stdout.write
. Sin embargo, la función deprint
permite definir el separador y el terminador y, por lo tanto, evita casi todos estos casos de esquina.os.write
es una llamada de bajo nivel para escribir en un archivo. Debe codificar manualmente los contenidos y también debe pasar el descriptor de archivo explícitamente. Esto está destinado a manejar solo código de bajo nivel que, por alguna razón, no se puede implementar en la parte superior de las interfaces de nivel superior. Casi nunca desea llamar a esto directamente, porque no es obligatorio y tiene una API peor que el resto.
Tenga en cuenta que si tiene un código que debe escribir cosas en un archivo, es mejor hacerlo:
my_file.write(a)
# ...
my_file.write(b)
# ...
my_file.write(c)
Que:
print(a, file=my_file)
# ...
print(b, file=my_file)
# ...
print(c, file=my_file)
Porque es más SECO Usando print
tienes que repetir file=
everytime. Esto está bien si tiene que escribir solo en un lugar del código, pero si tiene 5/6 escrituras diferentes es mucho más fácil simplemente llamar al método de write
directamente.
Dos de estos métodos requieren la importación de módulos completos. Basado en esto solo, print () es la mejor opción de uso estándar.
sys.stdout es útil cuando stdout puede cambiar. Esto proporciona bastante potencia para el manejo de la secuencia.
os.write es útil para tareas de escritura específicas (por ejemplo, escrituras sin bloqueo)
Esta pregunta se ha realizado varias veces en este sitio para sys.stdout vs. print:
Python: la diferencia entre sys.stdout.write e print
print () vs sys.stdout.write (): ¿y por qué?
Un ejemplo para usar os.write (escrituras de archivo no bloqueado demostradas en la pregunta a continuación). La función solo puede ser útil en algunos sistemas operativos, pero aún así debe seguir siendo portátil incluso cuando ciertos sistemas operativos no admiten comportamientos diferentes / especiales.