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 ».

Était-ce utile?

La solution

  1. Les deux blocs de code que vous avez données sont pas équivalent
  2. 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 que f 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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top