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 :

userdefined generators et inspect


Sujet :

Python

  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 userdefined generators et inspect
    Bonjour,

    Je définis une classe avec les méthodes __init__, __iter__ et next. Mon problème est que inspect.isgenerator() renvoie False sur ses instances.

    Comment suis-je censé procéder ?
    1/ Existe t'il une classe 'generator' dont je puisse dériver ?
    2/ Dois-je renseigner les attributs/méthodes close, gi_code, gi_frame, gi_running et throw; pour que isgenerator() réussisse ?
    3/ Dois-je laisser tomber inspect pour hasattr(x,'next')

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    Voici un générateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from inspect import isgeneratorfunction
     
    def gen(x):
        yield x
     
    isgeneratorfunction(gen) # retourne True
    3/ Dois-je laisser tomber inspect pour hasattr(x,'next')
    hasattr vérifie si attribut next appartient à l'objet, cela diffère de l'emploi de isgenerator.

  3. #3
    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
    Bonjour Fred, et merci!

    Désolé, je n'ai pas compris. L'exemple que tu donnes renvoie True sur
    isgenerator(gen()), pas sur isgenerator(gen) ; et je ne vois pas trop le lien avec mon cas, qui n'est pas un generatorfunction mais une classe que je souhaiterais voir détectée comme un générateur.

    Ai-je raté quelque chose ?

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    quelle version python avez-vous?

    Ensuite pour vérifier un type générateur je préfère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from types import GeneratorType
    print isinstance(mafonction, GeneratorType)
    Bizarre! Je me suis créé un générateur et pourtant il n'est pas reconnu, si quelqu'un à une idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    from types import GeneratorType
     
    class range_gen(object):
        def __init__(self, x, limit):
            self.x = x
            self.limit = limit
        def __iter__(self):
            return self
        def next(self):
            if self.x < self.limit:
                val, self.x = self.x, self.x+1
                yield val
            else:
                raise StopIteration()
     
    gen = range_gen(0, 25)
     
    print isinstance(gen, GeneratorType)

  5. #5
    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
    py2.6
    J'ai essayé d'hériter de GeneratorType, mais "type 'generator' is not an acceptable base type"

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 067
    Par défaut
    il est trop calé ce fred1599

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    J'ai essayé d'hériter de GeneratorType, mais "type 'generator' is not an acceptable base type"
    GeneratorType est un type et non un objet python...

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    generator est le type d'une méthode ou d'une fonction.

    classes et instances sont des objets pouvant contenir 0 ou plus méthodes... pouvant retourner (ou pas des objets) de type "generators".

    A partir de là, quel sens donner à un type generator pour une instance ou une classe? La réduction d'une classe à l'attribut/type d'une fonction est délicat...
    Par contre, le tas de fonctions/méthodes de class ou instance peuvent être regroupées en "interfaces": iterable/iterator sont alors des "interfaces" qui se rapportent à des "generator".
    voir les modules abc et collection. et le sens de isinstance(a, Iterable)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    En effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print isinstance(gen.next(), GeneratorType)
    était plus correct comme syntaxe

  10. #10
    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
    Il faut effectivement que je définisse proprement l'interface que je souhaite identifier.

    generator est le type d'une méthode ou d'une fonction
    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inspect.isgenerator( (k for k in range(10)) ) # -> True
    En quoi est-ce que la generator expression ci dessus est une méthode/fonction ?

    merci bcp à vous tous.

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Citation Envoyé par VV33D Voir le message
    En quoi est-ce que la generator expression ci dessus est une méthode/fonction?
    ça n'en est pas.
    au départ, l'idée était de souligner que fonction, generator et classe pouvaient être des objets qu'on ne pouvait pas s/classer.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/07/2003, 14h59
  2. Limite des GENERATORS
    Par Débéa dans le forum Débuter
    Réponses: 5
    Dernier message: 24/07/2003, 13h05
  3. Génération de code
    Par YAMKI dans le forum Rational
    Réponses: 5
    Dernier message: 22/04/2003, 16h41
  4. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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