J'ai le code vu comme celui-ci (code Python 3):Python ftplib: Comment libérer correctement l'objet connexion?
import ftplib
from contextlib import closing
with closing(ftplib.FTP()) as ftp:
est l'utilisation de la méthode closing
nécessaire? Dans un intéressant answer, nous pouvons lire que dans les objets de connexion de base de données, la méthode __exit__
du gestionnaire de contexte ne ferme pas la connexion (au moins pour SQLite), mais valide une transaction à la place. Par conséquent, l'utilisation de la méthode closing
est nécessaire.
Comment ça se passe avec la classe FTP de Python?
En regardant le sources du ftplib Python, nous pouvons trouver ceci:
# Context management protocol: try to quit() if active
def __exit__(self, *args):
if self.sock is not None:
try:
self.quit()
except (OSError, EOFError):
pass
finally:
if self.sock is not None:
self.close()
La méthode quit
est appelée donc je pense que nous ne devons pas utiliser la méthode closing
pour Python 3. Nous peut utiliser simplement:
with (ftplib.FTP()) as ftp:
Comme méthode __exit__
manque en Python 2, closing
est nécessaire pour le code Python 2.
Est-ce correct?
Vous avez répondu à votre propre question :) Dans Python2, comme vous l'avez indiqué. Il n'y a pas de fonction '__enter__' ou de fonction' __exit__', là, le handle de contexte ne fera rien lors de l'entrée ou de la sortie, sauf assigner la variable 'ftp' dans votre cas. Il s'agit donc d'un héritage et d'une compatibilité descendante. Vous pouvez l'ignorer si vous n'êtes pas intéressé à être un ninja à rebours. – Torxed
@Torxed Puisque Internet est jonché d'exemples de codes incorrects (je comprends que dans de nombreux petits scripts ponctuels, vous n'avez pas besoin de vous préoccuper de tels détails), on est facilement confus, alors je voulais avoir une confirmation. –
C'est une très bonne question à poser :) J'ai écrit une réponse un peu plus longue au cas où les gens trébucheraient à travers cette question. – Torxed