es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Debe ocurrir la “apertura del trabajo” de un gestor de contexto en __init__ o en __enter__?

Encontré el siguiente ejemplo de un Administrador de Contexto para un objeto File:

class File(object):
    def <strong>init</strong>(self, nombre_archivo, metodo):
        self.objeto_archivo = open(nombre_archivo, metodo)
    def <strong>enter</strong>(self):
        return self.objeto_archivo
    def <strong>exit</strong>(self, tipo, valor, traza):
        self.objeto_archivo.close()

Aquí, el trabajo realizado por el administrador, que es abrir el archivo, ocurre en el método __init__. Sin embargo, en el texto adjunto, sugieren que la apertura del archivo debería ocurrir en la llamada a __enter__:

Hablemos de lo que sucede detrás de escena.

  1. La instrucción with almacena el método exit de la clase File.
  2. Llama al método enter de la clase File.
  3. El método enter abre el archivo y lo devuelve.
  4. El identificador del archivo abierto se pasa a opened_file.
  5. Escribimos en el archivo usando .write().
  6. La instrucción with llama al método almacenado exit.
  7. El método exit cierra el archivo.

¿Cuál es el enfoque correcto en general? Parece que el trabajo deshecho por __exit__ debería ocurrir en __enter__, no en __init__, ya que estos se emparejan 1:1 mediante el mecanismo del administrador de contexto, pero este ejemplo me deja dudas.

Tags:  ,

Answer

  1. Avatar for davy.ai

    En general, el enfoque correcto para un gestor de contexto es realizar el trabajo de configuración en el método __enter__ y el trabajo de limpieza en el método __exit__. Esto asegura que los métodos emparejados funcionen juntos y que cualquier excepción que ocurra durante la configuración pueda ser manejada correctamente por el gestor de contexto.

    En el ejemplo proporcionado, el archivo se abre en el método __init__, lo cual no sigue las mejores prácticas para los gestores de contexto. Si bien este enfoque puede funcionar en casos simples, puede ocasionar problemas si se produce una excepción durante el proceso de apertura del archivo.

    Para seguir las mejores prácticas, la clase File debe actualizarse para abrir el archivo en el método __enter__ y cerrarlo en el método __exit__. Esto asegurará que el archivo se limpie correctamente y que cualquier excepción durante el proceso de configuración se maneje correctamente.

    En general, aunque el ejemplo proporcionado puede funcionar en algunos casos, no se considera la mejor práctica para los gestores de contexto en Python.

Comments are closed.