Asignación de la variable stdout
como que estás haciendo no tiene ningún efecto, suponiendo foo
contiene declaraciones print
- otro ejemplo de por qué nunca debe importar cosas de dentro un módulo (como se hace aquí), pero siempre un módulo como un todo (luego use nombres calificados). El copy
es irrelevante, por cierto. La correcta equivalente de su fragmento es:
import sys
save_stdout = sys.stdout
sys.stdout = open('trash', 'w')
foo()
sys.stdout = save_stdout
Ahora, cuando el código es correcto, es el momento para hacerlo más elegante o rápido. Por ejemplo, podría utilizar un objeto de tipo fichero en memoria en lugar del archivo 'basura':
import sys
import io
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
foo()
sys.stdout = save_stdout
para la elegancia, un contexto es mejor, por ejemplo:
import contextlib
import io
import sys
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
yield
sys.stdout = save_stdout
una vez que haya definido este contexto, para cualquier bloque en el que no desea una salida estándar,
with nostdout():
foo()
Más optimización: sólo tiene que sustituir sys.stdout con un objeto que tiene un no-op write
método. Por ejemplo:
import contextlib
import sys
class DummyFile(object):
def write(self, x): pass
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = DummyFile()
yield
sys.stdout = save_stdout
a usarse del mismo modo que la aplicación previa de nostdout
. No creo que sea más limpio o más rápido que esto ;-).
yo diría que usted debe dejar sin corregir, ya que Alex ya lo hizo por ti. Tendría más sentido para quién está leyendo. – cregox
Cawas: voy a agregar mi primer corrector sin corregir por encima. O algo similar con los mismos errores. Buena llamada –
relacionada: [Redirecciona temporalmente stdout/stderr] (http://stackoverflow.com/q/6796492/4279) – jfs