Redirección de flujo contextual en Python
La redirección de flujos de error y salida estándar (stdout y stderr) resulta útil en muchos escenarios. Sin embargo, los métodos convencionales a menudo se quedan cortos cuando una función contiene una referencia interna a estos flujos.
Necesidad de una solución dinámica
Técnicas de redirección tradicionales, como sys.stdout, redirigir transmisiones permanentemente. Este problema surge cuando un método copia inherentemente una de estas variables internamente. En consecuencia, estos métodos no logran redirigir adecuadamente las transmisiones.
Solución: Extensión del administrador de contexto
Para abordar eficazmente este problema, se puede emplear un enfoque de administrador de contexto. Este método implica envolver la lógica de redirección dentro de un administrador de contexto:
import os
import sys
class RedirectStdStreams(object):
def __init__(self, stdout=None, stderr=None):
self._stdout = stdout or sys.stdout
self._stderr = stderr or sys.stderr
def __enter__(self):
self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
self.old_stdout.flush(); self.old_stderr.flush()
sys.stdout, sys.stderr = self._stdout, self._stderr
def __exit__(self, exc_type, exc_value, traceback):
self._stdout.flush(); self._stderr.flush()
sys.stdout = self.old_stdout
sys.stderr = self.old_stderr
Al utilizar este administrador de contexto, puede redirigir secuencias sin problemas dentro del bloque de contexto:
devnull = open(os.devnull, 'w')
print('Fubar')
with RedirectStdStreams(stdout=devnull, stderr=devnull):
print("You'll never see me")
print("I'm back!")
Conclusión
La solución proporcionada aprovecha el patrón del administrador de contexto para redirigir temporalmente stdout y stderr, evitando las limitaciones de enfoques anteriores . Esta técnica resulta particularmente útil cuando se trata de funciones que poseen referencias locales a estos flujos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3