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