2009-09-02 11 views

Respuesta

247

en Python se utiliza la palabra clave with cuando se trabaja con recursos no administrados (como secuencias de archivo). Es similar a la declaración using en VB.NET y C#. Le permite asegurarse de que un recurso se "limpia" cuando el código que lo utiliza termina de ejecutarse, incluso si se lanzan excepciones. Proporciona 'azúcar sintáctico' para los bloques try/finally.

De Python Docs:

El comunicado aclara with código que previamente utilizaría try...finally bloques para asegurar que se ejecuta código de limpieza. En esta sección, discutiré la declaración, ya que se usará comúnmente. En la siguiente sección, examinaré los detalles de implementación y mostraré cómo escribir objetos para usar con esta declaración.

La declaración with es una estructura de flujo de control cuya estructura básica es:

with expression [as variable]: 
    with-block 

se evalúa la expresión, y debería resultar en un objeto que soporta el protocolo de gestión de contexto (es decir, tiene __enter__() y __exit__() métodos).

actualización fija VB llamada al comentario de Scott Wisniewski. De hecho estaba confundiendo with con using.

+4

¿Qué métodos se utilizan para cerrar el recurso abierto? ¿Qué pasaría si creara mi propio objeto de sistema de archivos que tuviera sus propios métodos especiales de abrir/cerrar, la palabra clave "con" funcionaría con esos? ¿O "con" solo funcionará con los tipos de recursos de Python incorporados? – MikeN

+9

En Python, parece que el objeto personalizado tendría que implementar (o heredar de algo que implementa) los métodos '__enter__' y' __exit__'. Con IronPython (python en.Net) puede implementar desde IDisposable y eso lo cubrirá. No estoy seguro de cuál es la mejor manera en Python puro u otros marcos. –

+1

FYI: esto confunde la declaración "using" en VB.NET, que se comporta como el bloque "with" en python, con la instrucción "with" en VB, que es completamente diferente. Vea lo siguiente: http://msdn.microsoft.com/en-us/library/htd05whh.aspx y http://msdn.microsoft.com/en-us/library/wc500chb(v=vs.110).aspx –

325

Explanation from the Preshing on Programming blog:

Es útil cuando se tienen dos operaciones relacionadas que le gustaría ejecutar como un par, con un bloque de código en el medio. El ejemplo clásico es la apertura de un archivo, manipulando el archivo, a continuación, cerrándola:

with open('output.txt', 'w') as f: 
    f.write('Hi there!') 

Lo anterior con la declaración se cerrará automáticamente el archivo después de la bloque anidado de código. (Continúe leyendo para ver exactamente cómo se produce el cierre ). La ventaja de usar una declaración with es que está garantizado para cerrar el archivo sin importar cómo sale el bloque anidado. Si se produce una excepción antes del final del bloque, cerrará el archivo antes de que un manejador externo de excepciones capture la excepción. Si el bloque anidado debe contener una declaración de devolución, o una declaración de interrupción continue o , la instrucción con cerrará automáticamente el archivo en esos casos, también.

+57

Entendí esto mucho mejor que la respuesta aceptada. Gracias. – rayryeng

+7

Encontré la explicación completa con ejemplos, aquí: http://preshing.com/20110920/the-python-with-statement-by-example/ – praba230890

+1

great explanation :) – jax

Cuestiones relacionadas