Diferencia entre input y sys.stdin

publicado por: Anonymous

A la hora de guardar un dato, sea del tipo que sea, ¿qué ventajas presenta input sobre sys.stdin y/o viceversa?
Por lo que entiendo, el resultado es el mismo.

solución

Los streams estándares son stdin, stdout y stderr, y representan ficheros conectados con la entrada, salida y salida de errores que tiene por defecto un proceso. Nuestra aplicación no debe asumir nada sobre ellos, ni que la entrada se haga por teclado, ni que la salida vaya a una terminal,…nada, tan sólo que se comportan como ficheros de texto que se leen y/o escriben línea a línea.

La función input tiene dos cometidos:

  • mostrar un mensaje (en stdout)
  • leer una línea de texto (de stdin)

Este comportamiento se puede simular de la siguiente manera::

import sys

sys.stdout.write("Dame un número:")
sys.stdout.flush()
n = sys.stdin.readline()

que equivale a

n = input("Dame un número:")

Evidentemente, es mucho más cómodo usar input que los streams estándares (Lo mismo pasa con usar print en lugar de stdout). Entonces, ¿para qué sirve usar los streams?.

Como he dicho antes, los streams se pueden ver como ficheros y se pueden intercambiar con ellos donde sea preciso. Es un sistema sencillo de crear baterías de pruebas de fragmentos de código. También es empleado para procesar la salida o entrada de procesos hijos (algo que se sale de tema).

Un ejemplo no trivial:

import sys
from io import StringIO

class WrapInput:
    def __init__(self, entrada):
        self.entrada = entrada

    def wrapper(self, f, *args, **kw):
        (sys.stdin, old_stdin) = (StringIO(self.entrada), sys.stdin)
        res = f(*args,**kw)
        sys.stdin = old_stdin
        return res

n = WrapInput("2").wrapper(input, "Dame un número: ")   
print("El número es {}".format(n))

No espera a que introduzcas el número por teclado, lee el "2" almacenado en StringIO.

Usar input o stdin es equivalente. Es más cómodo usar input en casi cualquier condición, pero con stdin puedes hacer mucha más magia.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *