90 votes

Utilisation de python avec l'instruction "with" avec le bloc try-except

Est-ce la bonne manière d'utiliser le python "avec la" déclaration en combinaison avec un try-except bloc?:

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

Si c'est le cas, compte tenu de la vieille façon de faire les choses:

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

Est le principal avantage de la "avec la" déclaration ici que nous pouvons nous débarrasser de trois lignes de code? Il ne semble pas que convaincante pour moi, pour ce cas d'utilisation (même si je comprends que la "avec la" déclaration a d'autres utilisations).

EDIT: c'Est la fonctionnalité de ces deux blocs de code identiques?

EDIT2: Les premières réponses de parler généralement sur les avantages de l'utilisation de "avec", mais celles-ci semblent de bénéfice marginal ici. Nous avons tous été (ou aurait été) appelant explicitement f.close() pendant des années. Je suppose que l'un des avantages est que bâclée codeurs vont bénéficier de l'aide de "avec".

131voto

Bernd Petersohn Points 1122
  1. Les deux blocs de code que vous avez donné sont pas d'équivalent
  2. Le code que vous avez décrit comme l' ancienne de faire les choses a un sérieux problème: dans le cas de l'ouverture du fichier échoue, vous obtenez une deuxième exception à la finally clause parce qu' f n'est pas lié.

L'équivalent de style ancien code serait:

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

Comme vous pouvez le voir, l' with instruction peut rendre les choses moins sujettes à erreur. Dans les plus récentes versions de Python (2.7, 3.1), vous pouvez également combiner plusieurs expressions dans un with déclaration. Par exemple:

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

En plus de cela, personnellement, je le considérer comme mauvaise habitude d'attraper une exception dès que possible. Ce n'est pas la finalité de l'exception. Si la fonction d'IO qui peut échouer est le cadre d'une opération compliquée, dans la plupart des cas, la IOError devrait abandonner l'ensemble de l'opération et donc être traités au niveau externe. À l'aide de with états, vous pouvez vous débarrasser de tous ces try...finally états à l'intérieur des niveaux.

7voto

Peter Milley Points 1541

Si le contenu de l' finally bloc sont déterminées par les propriétés de l'objet fichier étant ouvert, pourquoi ne pas le responsable de l'implémentation de l'objet fichier à écrire l' finally bloc? C'est l'avantage de l' with déclaration, beaucoup plus que de sauver trois lignes de code dans ce cas particulier.

Et oui, le chemin que vous avez combinées with et try-except est à peu près la seule façon de le faire, à titre exceptionnel les erreurs dues à l'intérieur de l' open déclaration elle-même ne peut pas être pris au sein de l' with bloc.

1voto

YoK Points 8221

Je pense que vous vous êtes trompé à propos de "avec", il n'en diminue lignes de. C'est en fait l'initialisation de la poignée et le démontage.

Dans votre cas "à" ne

  • ouvrir un fichier,
  • processus de son contenu, et
  • assurez-vous de fermer.

Voici le lien pour la compréhension de la "avec la" déclaration : http://effbot.org/zone/python-with-statement.htm

Edit: Oui, votre utilisation de "avec" est correct et la fonctionnalité des deux blocs de code est identique. Question sur les raisons d'utiliser "avec" ? c'est à cause des avantages que vous obtenez avec elle. comme vous l'avez dit à propos accidentellement manquant f.close().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X