72 votes

dois-je appeler close () après urllib.urlopen ()?

Je découvre Python et lis le code de quelqu'un d'autre:

Est-ce que urllib.urlopen() devrait être suivi de urllib.close() ? Sinon, il y aurait une fuite de connexions, correct?

105voto

Alex Martelli Points 330805

La méthode close doit être appelée sur le résultat de urllib.urlopen , pas sur le module urllib tel que vous le pensez (comme vous le mentionnez urllib.close - qui n'existe pas).

La meilleure approche: au lieu de x = urllib.urlopen(u) etc., utilisez:

 import contextlib

with contextlib.closing(urllib.urlopen(u)) as x:
   ...use x at will here...
 

Le with déclaration et le closing gestionnaire de contexte, assureront une fermeture correcte même en présence d'exceptions.

13voto

Mark Rushakoff Points 97350

Comme @Pierre dit, en dehors du champ ouvert Url deviendront admissibles pour la collecte des ordures.

Cependant, veuillez noter que, urllib.py définit:

 def __del__(self):
        self.close()

Cela signifie que lorsque le compteur de référence de cette instance atteint zéro, son __del__ méthode sera appelée, et donc de ses close méthode sera appelée ainsi. Le plus de façon "normale" pour le compte de référence pour atteindre le niveau zéro est de simplement laisser l'instance hors de portée, mais il n'y a strictement rien qui vous empêche d'explicite del x début (mais il ne fait pas directement appel __del__ mais juste décrémente le compteur de référence par un).

C'est certainement une bonne chose de style pour fermer explicitement vos ressources-en particulier lorsque votre application s'exécute le risque d'une trop grande utilisation de ladite ressources -- mais Python va nettoyer automatiquement pour vous si vous ne faites pas quelque chose de drôle comme le maintien (circulaire?) les références des instances que vous n'avez pas besoin de plus.

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