En utilisant python « avec » déclaration avec try-except bloc
-
30-09-2019 - |
Question
Est-ce la bonne façon d'utiliser le python « avec » déclaration en combinaison avec un try-except bloc:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Si elle est, considérant alors l'ancienne façon de faire les choses:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Le principal avantage de la déclaration « avec » ici que nous pouvons nous débarrasser de trois lignes de code? Il ne semble pas que convaincant me pour ce cas d'utilisation (si je comprends que le « par » déclaration a d'autres utilisations).
EDIT: La fonctionnalité de ce qui précède deux blocs de code identiques
?EDIT2: Les premières réponses parlent généralement sur les avantages de l'utilisation « avec », mais ceux qui semblent des avantages marginaux ici. Nous avons tous été (ou aurait dû) appeler explicitement f.close () pendant des années. Je suppose que l'un des avantages est que les codeurs bâclée bénéficieront d'utiliser « avec ».
La solution
- Les deux blocs de code que vous avez données sont pas équivalent
- Le code décrit comme ancienne
de faire les choses a un bug grave:
dans l'ouverture de cas, le fichier échoue
va obtenir une deuxième exception dans la
finally
clause parce quef
n'est pas lié.
Le code de style ancien équivalent serait:
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
Comme vous pouvez le voir, la déclaration de with
peut rendre les choses moins sujette aux erreurs. Dans les versions les plus récentes de Python (2.7, 3.1), vous pouvez également combiner plusieurs expressions dans une instruction with
. Par exemple:
with open("input", "r") as inp, open("output", "w") as out:
out.write(inp.read())
En outre, je considère personnellement comme 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, le IOError devrait annuler toute l'opération et ainsi être traité à un niveau extérieur. Utilisation d'instructions with
, vous pouvez vous débarrasser de toutes ces déclarations de try...finally
au niveau interne.
Autres conseils
Si le contenu du bloc finally
sont déterminées par les propriétés de l'objet fichier ouvert, pourquoi pas de l'objet implémenteur de fichier est celui d'écrire le bloc finally
? C'est au profit de la déclaration de with
, beaucoup plus que vous sauver trois lignes de code dans ce cas particulier.
Et oui, la façon dont nous avons combiné with
et try-except
est à peu près la seule façon de le faire, comme des erreurs exceptionnelles causées dans l'instruction open
elle-même ne peut pas être pris dans le bloc with
.
Je pense que vous avez mal à propos « par » déclaration qu'il ne fait que réduire les lignes. Il ne fait l'initialisation et la poignée désassemblage.
Dans votre cas "avec" fait
- ouvrir un fichier,
- traiter son contenu, et
- assurez-vous de le fermer.
Voici le lien pour la compréhension "avec" déclaration: 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 les raisons d'utiliser « avec »? il est en raison des avantages que vous obtenez avec elle. comme vous l'avez mentionné au sujet f.close accidentellement manquant ().
La façon plus Pythonic les codes suivants est:
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()