IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Close dans le destructeur de la classe file ?


Sujet :

Python

  1. #1
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut Close dans le destructeur de la classe file ?
    Bonjour,

    il m'avait semblé comprendre qu'il y avait une notion de destructeur (__del__ ?) en Python (bé oui, je viens du c++) et que ce mécanisme avait pour effet (entre autres) de fermer un fichier quand il sort du scope.

    en testant une fonction de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def spam (name):
        fic = open( name,'wb' )
        try:
            fait_quelque_chose_qui_peut_echouer( fic )
            return True
        except:
            return None
    j'ai l'impression que le fichier reste ouvert en sortant de cette fonction.

    Oui oui je sais, même avec ce genre de mécanisme, c'est plus propre de faire explicitement le ménage avant de sortir...
    Mais je me disais qu'un des avantages de python, c'était de permettre ce genre de racourci... (on n'est plus en C ici !)

    Ne ce serait-ce pas une histoire de garbage collector qui fait le ménage quand ça lui chante, et qui fait que mon fichier reste ouvert un "certain temps" après la sortie du scope ?

    Que dois-je faire docteur ?

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    De ce que j'ai toujours vu en python (et donc compris), c'est un fichier ouvert avec open, doit toujours être fermer manuellement via close(), ce qui est logique, surtout pour un fichier en écriture.

    Je crois qu'avec file au lieu de open, si aucune référence persistante n'existe pour un fichier ouvert via file, ce dernier est automatiquement fermé lorsqu'il ne sera plus utile

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for line in file('UnCheminDeFichier'):
        print line
    print file('UnCheminDeFichier').read()

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    open est simplement une "factory" et file le constructeur, il n'y a pas d'autre différences de comportement entre file et open. La seule chose est que si tu itères comme tu l'as décrit, tu ouvres le fichier en lecture, mode dans lequel la non-fermeture n'a en général pas de conséquences.
    En Python, les fichiers ne sont pas fermés automatiquement.
    Un code utile mais ne fonctionnant qu'à partir de Python 2.6 (ou 2.5 avec from __future__ import with_statement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open(name, 'wb') as fd:
        ecrire_dans(fd)
    Ceci fermera automatiquement le fichier, même en cas d'erreur si je ne m'abuse.

  4. #4
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Et voilà, encore un qui aurait dû lire la doc avant d'aller embêter ses pairs...
    8.7 Predefined Clean-up Actions
    Some objects define standard clean-up actions to be undertaken when the object is no longer needed, regardless of whether or not the operation using the object succeeded or failed. Look at the following example, which tries to open a file and print its contents to the screen.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in open("myfile.txt"):
        print line
    The problem with this code is that it leaves the file open for an indeterminate amount of time after the code has finished executing. This is not an issue in simple scripts, but can be a problem for larger applications. The with statement allows objects like files to be used in a way that ensures they are always cleaned up promptly and correctly.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with open("myfile.txt") as f:
        for line in f:
            print line
    After the statement is executed, the file f is always closed, even if a problem was encountered while processing the lines. Other objects which provide predefined clean-up actions will indicate this in their documentation.
    extrait de la doc de python 2.5, pfff...

    encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/11/2006, 17h12
  2. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  3. [JAR][Applet]Truncated class file
    Par frog dans le forum Applets
    Réponses: 5
    Dernier message: 22/08/2005, 12h41
  4. Conseil du compilo sur un destructeur d'une classe
    Par okparanoid dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2005, 20h11
  5. [Débutant][JNDI] Erreur "bad class file"
    Par giffle dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/01/2005, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo