Recomendaría usar la declaración with
de Python para administrar los recursos que deben limpiarse. El problema con el uso de una declaración explícita de close()
es que tiene que preocuparse de que las personas se olviden de llamarlo o se olviden de colocarlo en un bloque finally
para evitar una pérdida de recursos cuando se produce una excepción.
utilizar la instrucción with
, crear una clase con los siguientes métodos:
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
En el ejemplo anterior, tendrá que utilizar
class Package:
def __init__(self):
self.files = []
def __enter__(self):
return self
# ...
def __exit__(self, exc_type, exc_value, traceback):
for file in self.files:
os.unlink(file)
Entonces, cuando alguien quería utilizar su clase , que harían lo siguiente:
with Package() as package_obj:
# use package_obj
el package_obj variable será una instancia del tipo Paquete (es el valor devuelto por el método __enter__
). Se llamará automáticamente a su método __exit__
, independientemente de si se produce una excepción o no.
Incluso podría llevar este enfoque un paso más allá. En el ejemplo anterior, alguien aún podría instanciar el paquete usando su constructor sin usar la cláusula with
. No quieres que eso suceda. Puede solucionarlo creando una clase PackageResource que defina los métodos __enter__
y __exit__
. Entonces, la clase del paquete se definiría estrictamente dentro del método __enter__
y se devolvería.De esta manera, la persona que llama nunca podría crear una instancia de la clase del paquete sin necesidad de utilizar una declaración with
:
class PackageResource:
def __enter__(self):
class Package:
...
self.package_obj = Package()
return self.package_obj
def __exit__(self, exc_type, exc_value, traceback):
self.package_obj.cleanup()
que tendría que utilizar esto como sigue:
with PackageResource() as package_obj:
# use package_obj
Al leer lo que vinculó, las variables globales que desaparecen no parecen aplicarse aquí a menos que esté hablando de cuándo se está ejecutando el programa, durante el cual supongo que de acuerdo con lo que vinculó podría ser POSIBLE que el módulo del sistema operativo sea Ya se fue. De lo contrario, no creo que se aplique a las variables miembro en un método __del __(). –
La excepción se produce mucho antes de que mi programa salga. La excepción AttributeError que recibo es que Python dice que no reconoce self.files como un atributo de Package. Puede que me esté equivocando, pero si por "globales" no quieren decir variables globales para los métodos (pero posiblemente de clase local a local), entonces no sé qué causa esta excepción. Google insinúa que Python se reserva el derecho de limpiar los datos de los miembros antes de llamar a __del__ (self). – wilhelmtell
El código publicado parece funcionar para mí (con Python 2.5). ¿Puede publicar el código real que está fallando, o simplificado (cuanto más simple es la mejor versión que todavía causa el error? – Silverfish