Est-ce la bonne façon d'utiliser l'instruction python "with" en combinaison avec un bloc try-except?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Si tel est le cas, compte tenu de l'ancienne façon de faire les choses:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Est-ce que le principal avantage de la déclaration «avec» ici est que nous pouvons nous débarrasser de trois lignes de code? Cela ne me semble pas convaincant pour ce cas d'utilisation (même si je comprends que l'instruction "with" a d'autres utilisations).
EDIT: La fonctionnalité des deux blocs de code ci-dessus est-elle identique?
EDIT2: Les premières réponses parlent généralement des avantages d'utiliser "avec", mais ceux-ci semblent être marginaux ici. Nous avons tous (ou aurions dû) appeler explicitement f.close () depuis des années. Je suppose qu'un avantage est que les codeurs bâclés bénéficieront de l'utilisation de "avec".
Réponses:
finally
clause car ellef
n'est pas liée.L'ancien code équivalent serait:
Comme vous pouvez le voir, l'
with
instruction peut rendre les choses moins sujettes aux erreurs. Dans les versions plus récentes de Python (2.7, 3.1), vous pouvez également combiner plusieurs expressions dans une seulewith
instruction. Par exemple:En plus de cela, je considère personnellement que c'est une mauvaise habitude d'attraper une exception le plus tôt possible. Ce n'est pas le but des exceptions. Si la fonction IO qui peut échouer fait partie d'une opération plus compliquée, dans la plupart des cas, IOError doit abandonner toute l'opération et donc être gérée à un niveau externe. En utilisant des
with
déclarations, vous pouvez vous débarrasser de toutes cestry...finally
déclarations aux niveaux internes.la source
Si le contenu du
finally
bloc est déterminé par les propriétés de l'objet fichier en cours d'ouverture, pourquoi l'implémenteur de l'objet fichier ne devrait-il pas être celui qui écrit lefinally
bloc? C'est l'avantage de l'with
instruction, bien plus que de vous faire économiser trois lignes de code dans cette instance particulière.Et oui, la façon dont vous avez combiné
with
ettry-except
est à peu près la seule façon de le faire, car les erreurs exceptionnelles causées dans l'open
instruction elle-même ne peuvent pas être détectées dans lewith
bloc.la source
Je pense que vous vous êtes trompé sur l'affirmation «avec» selon laquelle il ne fait que réduire les lignes. Il effectue en fait l'initialisation et gère le démontage.
Dans votre cas, "avec" fait
Voici le lien pour comprendre la déclaration «avec»: http://effbot.org/zone/python-with-statement.htm
Edit: Oui, votre utilisation de "avec" est correcte et la fonctionnalité des deux blocs de code est identique. Question sur pourquoi utiliser "avec"? c'est à cause des avantages que vous en retirez. comme vous l'avez mentionné à propos de f.close () manquant accidentellement.
la source
La manière la plus pythonique pour les codes suivants est:
la source
readline()
appel manquant , votre version ne ferme pas le fichier si lereadline()
résultat est unIOError
.