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 :

Problème de lambda dans boucle for [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut Problème de lambda dans boucle for
    Bonjour,
    J'ai un problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    self.actionAddRecipeDict = {}
    for i in range(8):
    	if i >1:
    		self.actionAddRecipeDict[i] = QtWidgets.QAction(f"{i} cases")
    	else:
    		self.actionAddRecipeDict[i] = QtWidgets.QAction(f"{i} case")
    	self.addRecipeMenuBar.addAction(self.actionAddRecipeDict[i])
     
    	# self.actionAddRecipeDict[i].triggered.connect(lambda i: print(i))
    	# self.actionAddRecipeDict[i].triggered.connect(functools.partial(print, i))
    le problème est que self.actionAddRecipeDict[i].triggered.connect(lambda i: print(i)) renvoie False et self.actionAddRecipeDict[i].triggered.connect(functools.partial(print, i)) renvoie i FalseBien sur le but n'est pas d'afficher i, mais d'appeler une fonction : AddRecipe(i) mais je ne suis pas sur que ça change grand chose au problème ..

    Merci bien

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Il faut stocker la valeur une référence du i comme valeur par défaut en écrivant lambda i=i: print(i). Chouette n'est ce pas?

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

  3. #3
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    J'ai déjà pensé à ça mais ça ne change rien, self.actionAddRecipeDict[i].triggered.connect(lambda i=i: print(i)) renvoie toujours False ...

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ça renvoie False où ?

    Si print devait renvoyer quelque chose, je ne vois pas où mais bon, ce serait plutôt None.


    Edit: j'ai recherché un ancien code où j'avais aussi un menu dynamique, donc nombre d'éléments déterminés par le contexte et tu dois obtenir ce que tu veux
    avec: lambda who=i: self.AddRecipe(who)Ça fait bricolage mais c'est légal.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par flapili Voir le message
    J'ai déjà pensé à ça mais ça ne change rien, self.actionAddRecipeDict[i].triggered.connect(lambda i=i: print(i)) renvoie toujours False ...
    C'est que le problème est ailleurs...
    Peut être que remplacer la boucle par la définition d'un seul élément (i = 1 par exemple) vous permettrait d'y voir plus clair.

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

  6. #6
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    En effet même sans boucle for j'ai ce problème ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = 1
    self.actionAddRecipeDict[1].triggered.connect(lambda a=i: print(a))
    Quand je clique sur mon QAction de mon menuBar le print renvoie False,
    par contre avec self.actionAddRecipeDict[1].triggered.connect(lambda: print(1)) renvoie bien 1 ..


    encore plus étrange en utilisant functools.partial : self.actionAddRecipeDict[i].triggered.connect(functools.partial(print, i)) j'ai "1 False" ... cette fois-ci j'ai bien mon i qui est print mais d'où viens se False ?

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    functool n'a rien à faire là-dedans et tu ne répond pas à ma question.

  8. #8
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    functool n'a rien à faire là-dedans et tu ne répond pas à ma question.
    La question était :
    Ça renvoie False où ?
    Quand je clique sur mon QAction de mon menuBar le print renvoie False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = 1
    self.actionAddRecipeDict[1].triggered.connect(lambda a=i: print(a))
    Au lien d'avoir 1 j'ai False

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par flapili Voir le message
    Au lien d'avoir 1 j'ai False
    QAction.triggered emet déjà un argument bool checked = false qui va sera le "a" de lambda a=i: print(a). Il faut l'écrire: lambda checked, a=i: print(checked, a).

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

  10. #10
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Merci bien pour votre aide, sujet résolu.

    Je poste le code si jamais ça peut aider quelqu'un plus tard.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in (8, 16, 32, 64):
    	self.actionAddRecipeDict[i] = QtWidgets.QAction(str(i))
    	self.actionAddRecipeDict[i].triggered.connect(lambda checked, i=i: AddRecipe(i, self.mainWindow))
    	self.addRecipeMenuBar.addAction(self.actionAddRecipeDict[i])

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

Discussions similaires

  1. [XL-2007] Problème dans boucle for et if
    Par flo1411 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 15/04/2013, 14h04
  2. Problème de soustraction dans Boucle For each
    Par athos7776 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/04/2011, 05h46
  3. Problème d'index dans boucle for
    Par cocacola0589 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 09/02/2010, 18h22
  4. problème dans boucle for de lecture de fichier ini
    Par chourmo dans le forum Delphi
    Réponses: 3
    Dernier message: 06/07/2006, 09h31
  5. [VB6] Problème contrôle Timer et boucle For-Next ...
    Par Stéphane BEHMENBURG dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/12/2005, 17h36

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