Domanda

E 'questo il modo giusto di usare il pitone "con" l'istruzione in combinazione con un try-except blocco:?

try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

Se lo è, allora considerando il vecchio modo di fare le cose:

try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

è il vantaggio principale del "con" dichiarazione qui che possiamo sbarazzarci di tre righe di codice? Non sembra che interessante per me per questo caso d'uso (anche se capisco che il "con" dichiarazione ha altri usi).

EDIT: E 'la funzionalità di quanto sopra due blocchi di codice identiche

?

EDIT2: Le prime risposte parlano generalmente circa i vantaggi di utilizzare "con", ma quelli sembrano di beneficio marginale qui. Siamo stati tutti (o avrebbero dovuto essere) chiamando esplicitamente f.close () per anni. Suppongo che uno dei vantaggi è che i programmatori sciatta potranno trarre vantaggio dall'utilizzo di "con".

È stato utile?

Soluzione

  1. I due blocchi di codice avete dato sono non equivalente
  2. Il codice che hai descritto come vecchia maniera di fare le cose ha un grave bug: nel caso il file di apertura si riesce otterrà una seconda eccezione nel finally clausola perché non è f bound.

Il codice equivalente vecchio stile potrebbe essere:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

Come si può vedere, la dichiarazione with può rendere le cose meno incline errore. Nelle versioni più recenti di Python (2.7, 3.1), è possibile anche combinare più espressioni in una dichiarazione with. Ad esempio:

with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

Oltre a questo, io personalmente lo considerano cattiva abitudine di catturare qualsiasi eccezione il più presto possibile. Questo non è lo scopo di eccezioni. Se la funzione IO che può non è parte di un'operazione più complicata, in molti casi l'IOError deve interrompere l'intera operazione e così essere gestita a livello esterno. Utilizzando dichiarazioni with, si può sbarazzarsi di tutte queste affermazioni try...finally a livello interiore.

Altri suggerimenti

Se il contenuto del blocco finally sono determinate dalle proprietà dell'oggetto file che viene aperto, perché non dovrebbe il realizzatore del file oggetto essere quello di scrivere il blocco finally? Quel il beneficio della dichiarazione with, molto di più che salvare voi tre righe di codice in questo caso particolare.

E sì, il modo in cui hai combinato with e try-except è praticamente l'unico modo per farlo, come errori eccezionali causati all'interno dell'istruzione open stesso non possono essere catturati all'interno del blocco with.

penso che si sbagli di "con" affermazione che riduce solo linee. Realmente fa inizializzazione e manico smontaggio.

Nel vostro caso "con" fa

  • aprire un file,
  • elaborare il suo contenuto, e
  • assicurarsi per chiuderla.

Ecco collegamento per la comprensione "con" dichiarazione: http://effbot.org /zone/python-with-statement.htm

Edit: Sì che l'uso di "con" è corretto e la funzionalità di entrambi i blocchi di codice è identico. Domanda sul perché di usare "con"? è a causa di vantaggi che si ottiene con esso. come lei ha detto accidentalmente f.close mancante ().

Il modo più Pythonic per i seguenti codici è:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

try:
    f = open("file", "r")
except IOError:
    <whatever>
else:
    f.close()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top