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 :

fonction non itérable


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 fonction non itérable
    Bonsoir,

    J'essaye de rendre une fonction directement iterable. Le code ci-dessous marche pour une instance mais pas pour une fonction ! Pourquoi ? Voyez vous comment faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def iterbug():
        ipipo= lambda: iter((1,))
        class X:pass
        x= X()
        x.__iter__= ipipo
        iter(x) # ca marche
        def f():pass
        f.__iter__= ipipo
        iter(f) # TypeError: 'function' object is not iterable
    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Je ne crois pas que rendre une fonction iterable ait beaucoup de sens… Je crois qu’il vaut mieux soit créer un objet “callable” qui soit aussi iterable, soit faire de la fonction un générateur (avec le mot-clé yield)!

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 074
    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 074
    Par défaut
    Je plussoie mont29, j'allais répondre la même chose, on peut itérer soit des conteneurs, soit des générateurs, voir la documentation...

  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
    Je ne crois pas que rendre une fonction iterable ait beaucoup de sens
    Pourquoi ? Quelle différence avec le callable iterable que tu suggères ?

    Dans mon cas, j'ai un framework qui itère récursivement sur des "taches" renvoyant des "taches" (par exemple des generateurs). Pouvoir inclure les fonctions dans ce framework d'itération a pour moi du sens. Cela étant, je reconnais que je pourrai transformer mon framework d'iterables en un framework de callable (et y inclure des iterable via leur .next)

    Quoi qu'il en soit, j'ai un objet qui supporte le protocole iterable et que python ne reconnait pas comme tel. Comment ? Pourquoi ? Le protocole est il restreint aux instances ? coin-coin ?

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 074
    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 074
    Par défaut
    C'est logique, x est une instance d'une classe créée par tes soins, où tu implémentes une méthode spéciale __iter__.

    Seulement une fonction est un objet spécifique python qui n'est pas créer avec la méthode spéciale __iter__.

    Si tu veux créér un objet représentant une fonction sur mesure, il faudra là fabriquer sans doute avec la méthode __call__.

  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
    Je ne trouve pas cela si logique ! Je n'ai pas vraiment implémenté une méthode __iter__, j'ai juste mis un attribut __iter__ (différent des autres méthodes spéciales nécessitant une vrai méthode et pas juste un attribut). Une fonction n'est pas un objet ? La doc précise
    objects of any classes you define with an __iter__() or __getitem__()
    Je pensais que le duck typing était la règle pour savoir ce qui est itérable ou pas en Python. Ce n'est donc pas aussi simple que hasattr(x,'__iter__') !

    Merci à tous les deux pour vos réponses !

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

Discussions similaires

  1. [LDAP] Fonctions non reconnues
    Par Wormus dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 10/01/2006, 13h46
  2. fonction non définie
    Par ston dans le forum Access
    Réponses: 11
    Dernier message: 12/12/2005, 16h02
  3. Verifier formulaire - fonction non appelée
    Par nerick dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/12/2005, 17h44
  4. [Configuration] Installation de PHP + Pbm de fonctions non reconnues
    Par BARBIER dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 23/11/2005, 10h54
  5. Le linker ignore les fonctions non implémentées
    Par Rodrigue dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/03/2005, 13h31

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