2009-09-02 13 views

risposta

247

in Python la parola with viene utilizzato quando si lavora con risorse non gestite (come flussi di file). È simile all'istruzione using in VB.NET e C#. Ti permette di assicurarti che una risorsa sia "ripulita" quando il codice che la usa finisce, anche se vengono lanciate eccezioni. Fornisce 'zucchero sintattico' per i blocchi try/finally.

Da Python Docs:

Il with dichiarazione chiarisce il codice che in precedenza avrebbe utilizzato try...finally blocchi al fine di garantire l'esecuzione che il codice di clean-up. In questa sezione, discuterò la dichiarazione come verrà comunemente utilizzata. Nella prossima sezione, esaminerò i dettagli di implementazione e mostrerò come scrivere oggetti da usare con questa affermazione.

Il with affermazione è una struttura di controllo di flusso la cui struttura di base è:

with expression [as variable]: 
    with-block 

L'espressione viene valutata, e dovrebbe tradursi in un oggetto che supporta il protocollo di gestione del contesto (vale a dire, ha __enter__() e Metodi __exit__()).

Aggiornamento fissato VB richiamo per il commento di Scott Wisniewski. Stavo davvero confondendo with con using.

+4

Quali metodi vengono utilizzati per chiudere la risorsa aperta? Cosa succede se ho creato il mio oggetto file system che aveva i suoi metodi di apertura/chiusura speciali, la parola chiave "con" funzionerebbe con quelli? Oppure "with" funziona solo con i tipi di risorse Python integrati? – MikeN

+9

In Python sembra che l'oggetto personalizzato debba implementare (o ereditare da qualcosa che implementa) i metodi '__enter__' e' __exit__'. Con IronPython (python su.Net) è possibile implementare da IDisposable e che lo coprirà. Non sei sicuro di quale sia il modo migliore in Python puro o in altri framework. –

+1

FYI: questo confonde l'istruzione "using" in VB.NET, che si comporta come il blocco "with" in python, con l'istruzione "with" in VB che è completamente diversa. Vedere quanto segue: http://msdn.microsoft.com/en-us/library/htd05whh.aspx e http://msdn.microsoft.com/en-us/library/wc500chb(v=vs.110).aspx –

325

Explanation from the Preshing on Programming blog:

E 'utile quando si dispone di due operazioni correlate che vorresti eseguire come una coppia, con un blocco di codice in mezzo. Il classico esempio è apertura di un file, manipolare il file, quindi chiusura:

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

È possibile che con la dichiarazione si chiude automaticamente il file dopo il blocco nidificato di codice. (Continua a leggere per vedere esattamente come si verifica la chiusura .) Il vantaggio dell'uso di una dichiarazione with è che è garantito per chiudere il file indipendentemente da come il blocco nidificato viene chiuso. Se si verifica un'eccezione prima della fine del blocco, verrà chiuso il file prima che l'eccezione venga catturata da un gestore di eccezioni esterno. Se il blocco nidificato dovesse contenere un'istruzione di reso, o una dichiarazione di interruzione continua o , l'istruzione with chiuderà automaticamente il file anche in questi casi.

+57

L'ho capito molto meglio della risposta accettata. Grazie. – rayryeng

+7

Ho trovato la spiegazione completa con esempi, qui: http://preshing.com/20110920/the-python-with-statement-by-example/ – praba230890

+1

ottima spiegazione :) – jax