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 :

yield pendant un with


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut yield pendant un with
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with some_context() : yield
    Quel est l'intérêt de pouvoir __enter___ dans un contexte en évitant de __exit__ ? C'est justement la raison d’être du contexte ! Pour retarder le __exit__ ? Sans garantie de qui va se passer avant le prochain next() (s'il se produit!).

    Pourquoi avoir autorisé cela, connaissez-vous une utilisation ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 140
    Par défaut
    Hello,

    peut etre que ca répond en partie à la question

    http://sametmax.com/comment-utiliser...urs-en-python/

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    yield ne fait pas sortir du contexte.

    Petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def test(nf):
        with open(nf, 'r') as f:
             for ligne in f:
                 yield ligne.rstrip()
     
    for ligne in test("test07.txt"):
        print ligne
    Dans cet exemple, toutes les lignes sont renvoyées par yield et affichées.

    Si à la 1ère ligne lue, yield avait fait sortir du contexte (comme l'aurait fait return), le fichier aurait été fermé et la 2ème ligne n'aurait pas pu être lue.

  4. #4
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Si à la 1ère ligne lue, yield avait fait sortir du contexte (comme l'aurait fait return), le fichier aurait été fermé
    Ok pour l'utilisation. Je n'avais jamais réalisé à quel point c'était dangereux (si l'utilisateur de ta fonction test fait un break quand il a trouvé un mot qu'il recherche par exemple).

    Le with dans ton exemple ne garantit "quasiment" rien par rapport à ouverture/fermeture explicite de fichier

    un exemple marrant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def neverCloseFile():
        with open(fichier) as f:
            for x in repeat(f): yield x
    Pourquoi le générateur n'est il pas capable de fermer ses contextes lorsqu'il est collecté par le GC ?

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    La méthode __exit__ sera appelé lorsque le générateur sera collecté...

    Citation Envoyé par doc officielle
    After execution of the with-block is finished, the object’s __exit__() method is called, even if the block raised an exception, and can therefore run clean-up code.
    Source

  6. #6
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Mais la on est dans aucun des cas (with-block is finished / block raised an exception). Par contre, la même doc précise
    The addition of the close() method has one side effect that isn’t obvious. close() is called when a generator is garbage-collected, so this means the generator’s code gets one last chance to run before the generator is destroyed. This last chance means that try...finally statements in generators can now be guaranteed to work
    Mais ça n'a pas l'air de marche chez moi...

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

Discussions similaires

  1. Conserver l'affichage pendant les calculs ?
    Par ceugniet dans le forum C++Builder
    Réponses: 5
    Dernier message: 31/03/2004, 12h19
  2. [Débutant] Utilisation de FOP - Register Fonts with FOP
    Par Johnbob dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 31/01/2004, 00h27
  3. installation php avec option --with-pgsql: marche pô.
    Par phil25 dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2004, 15h59
  4. Published property d'un compo conservées pendant l'exécution
    Par bobby-b dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/09/2003, 10h15
  5. Rafraichissement de la fenetre pendant le traitement
    Par Bobx dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/02/2003, 15h13

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