En Python, si vous ouvrez un fichier sans appeler close()
ou fermer le fichier mais sans utiliser try
- finally
ou le " with
"Cela pose-t-il un problème ? Ou est-il suffisant, en tant que pratique de codage, de s'appuyer sur le ramasse-miettes de Python pour fermer tous les fichiers ? Par exemple, si l'on fait ceci :
for line in open("filename"):
# ... do stuff ...
... est-ce un problème parce que le fichier ne peut jamais être fermé et qu'une exception peut se produire qui l'empêche d'être fermé ? Ou bien le fichier sera-t-il définitivement fermé à la fin de l'opération for
parce que le fichier sort du champ d'application ?
18 votes
Le fichier fait no sortent du champ d'application à la fin de la
for
bloc. Son nombre de références passera à zéro, ce qui entraînera sa fermeture automatique, mais seules les fonctions, les classes et les modules définissent des portées en Python, et non d'autres instructions composées.26 votes
Ce n'est pas un problème tant que ce n'est pas un problème. Au niveau du système d'exploitation, tous les fichiers ouverts par le script seront fermés lorsque le script sortira, vous n'avez donc pas à vous soucier de la fermeture des fichiers dans les script de l'outil jetable. Cependant, les processus ont une limite sur le nombre de fichiers ouverts qu'ils peuvent maintenir, donc les script complexes ou de longue durée doivent être plus prudents. Dans tous les cas, c'est une bonne habitude de fermer vos fichiers.
3 votes
@agf : Vous avez raison de dire que le fichier ne sort pas du champ d'application, mais ce n'est pas lié à la distinction entre
for
et les fonctions/classes/modules. C'est beaucoup plus simple que cela : les objets n'ont pas de portée, seuls les noms en ont une. Il n'y a pas de nom qui se réfère à cet objet, donc il n'y a rien ici qui reste dans la portée ou qui en sorte.0 votes
@max Mon commentaire corrige son hypothèse selon laquelle il existe un champ d'application associé au champ d'application
for
et en mentionnant que le fichier est fermé pour une raison totalement différente. Il n'entre pas dans ce que sont les lunettes en Python, car ce n'est pas pertinent ici.0 votes
@max il y a une référence implicite à cette boucle for... c'est un argument de sémantique