2012-07-10 9 views
8

Digamos que tienes:¿Vale la pena cerrar archivos en pequeñas funciones?

def my_func(): 
    fh = open(...) 
    try: 
     print fh.read() 
    finally: 
     fh.close() 

Mi primera pregunta es: ¿Vale la pena tener la sentencia try/finally (o con)? ¿No se cierra el archivo de todos modos cuando la función finaliza (a través de la recolección de basura)?

me encontré con esto después de leer una receta de forma "libro de cocina de Python" de Martelli, donde

all_the_text = open('thefile.txt').read() 

viene con el comentario: "Cuando lo haga, ya no tiene una referencia al objeto de archivo tan pronto como sea la operación de lectura termina. En la práctica, Python nota la falta de una referencia a la vez e inmediatamente cierra el archivo ".

Mi ejemplo de función es casi el mismo. Usted tiene una referencia, es solo que la referencia tiene una vida muy corta.

Mi segunda pregunta es: ¿Qué significa "inmediatamente" en la declaración de Martelli? Aunque no tiene ninguna referencia, ¿no se produce el cierre del archivo en el momento de la recogida de basura?

+0

No diría que su ejemplo es similar en absoluto. Está asignando el archivo a la variable 'fh' mientras' open ('thefile.txt'). Read() 'simplemente usa' read' directamente de la referencia cuando se crea sin guardarla. Creo que eso es lo que quiere decir con * inmediatamente * – jamylak

+0

posible duplicado de [python cerrar pregunta del descriptor de archivo] (http://stackoverflow.com/questions/4599980/python-close-file-descriptor-question) – jamylak

Respuesta

12

Es una buena práctica cerrar el archivo usted mismo. El uso de la declaración with conduce a la limpieza del código y cierra automáticamente el archivo (que es una buena cosa).

Aunque Python es un lenguaje de programación de alto nivel, aún necesita tener el control de lo que está haciendo. Como regla general: si abre un archivo, también debe estar cerrado. Nunca hay una buena razón para ser descuidado en su código :-)

En relación con su segunda pregunta: no se ejecutará de inmediato, se ejecutará cuando el recolector de basura decida que es hora de ejecutar. Cuando el objeto del archivo se desasigna, Python cerrará el archivo. Aquí están somearticles en la recolección de basura en Python (también vea el módulo gc), es una lectura interesante.

También muestra que la recolección de elementos no utilizados de Python usa un umbral basado en la cantidad de objetos asignados y desasignados antes de que decida recolectar la basura. Si su archivo es grande, entonces Python puede mantener el archivo abierto más de lo necesario porque es posible que el código de recolección no se haya ejecutado todavía.

+2

Bastante. Lo que es más intrigante para mí es lo que sucede bajo el capó y lo que sucede una vez que el recuento cae a 0. Ver mi edición (que contiene la segunda pregunta sobre la declaración "inmediata" de Martelli). –

+2

Probablemente debería tener en cuenta que CPython utiliza una mezcla de recuento de referencias y recolección de elementos no utilizados, por lo que en casos simples, la basura se recoge inmediatamente cuando se destruye la última referencia. –