2010-11-05 9 views
4

Je cespassage condition booléenne en tant que paramètre

def MsgBox1_YesChosen(sender,e): 
    if e.Key != "A": function0() 
    else: 
     function1() 
     function2() 
     function3() 

def MsgBox1_NoChosen(sender,e): 
    if e.Key == "A": function0() 
    else: 
     function1() 
     function2() 
     function3() 

peuvent tous deux être fusionnés ensemble def? La seule différence entre eux est « == », « ! = »

Répondre

1
def MsgBox1_WhatIsChosen(sender, e, yesOrNo): 
    if (e.Key != 'A') == yesOrNo: 
    function0() 
    else: 
    function1() 
    function2() 
    function3() 

def MsgBox1_YesChosen(sender,e): 
    return MsgBox1_WhatIsChosen(sender, e, True) 

def MsgBox1_NoChosen(sender,e): 
    return MsgBox1_WhatIsChosen(sender, e, False) 
+0

C'est ce que je cherchais – Michael

+0

:) Le '' == devrait être un 'is', en supposant bien sûr que cela ne jamais être utilisé avec booléens. – delnan

0

Je suppose que c'est un code à base d'événement, auquel cas vous ne pouvez pas modifier directement le nombre de paramètres de l'événement prend. Cependant, vous avez toujours deux possibilités:

1) Vous pourriez être en mesure d'inspecter le paramètre e pour trouver quel type d'événement s'est produit (oui ou non). Vérifiez la documentation de la bibliothèque que vous utilisez.

2) Vous pouvez ajouter le troisième paramètre, puis utilisez lambdas pour fournir le troisième argument lorsque vous liez les événements (code exemple suppose Tkinter):

def MsgBox1_Chosen(sender, e, yes_chosen): 
    if (e.Key != "A") == yes_chosen: function0() 
    else: 
     function1() 
     function2() 
     function3() 

msg_box.bind('<Event-Yes>', lambda s,e: MsgBox1_Chosen(s,e,True)) 
msg_box.bind('<Event-No>', lambda s,e: MsgBox1_Chosen(s,e,False)) 
4

Oui, de façon très générale - que vous venez de Vous devez comprendre que (1) les fonctions sont des valeurs de première classe et (2) les opérateurs ne sont que des fonctions avec un traitement syntaxique spécial. Par exemple:

def make_handler(predicate) 
    def handler(sender, e): 
     if predicate(e.Key, 'A'): 
      function0() 
     else: 
      function1() 
      function2() 
      function3() 
    return handler 

utilisation comme (après l'importation operator - vous pouvez le faire avec un lambda, mais pour les opérateurs du module operator est la solution plus propre) MsgBox1_YesChosen = make_handler(operator.ne) (c'est un horrible nom BTW).

+0

Si le 'si prédicat (e.Key, A):' a été changé en juste 'si prédicat():', vous pouvez simplement utiliser quelque chose comme 'f1 = make_handler (lambda: e.Key ==" A ")' et 'f2 = make_handler (lambda: e.Key! =" A ")' - pas besoin de jouer avec le module 'operator'. – martineau

+0

@martineau: Non. 'E' n'est pas défini quand le gestionnaire est créé, il est différent pour chaque invocation du gestionnaire! – delnan

+0

Dans ce cas, 'lambda e: e.Key! =" A "' ne fonctionnerait-il pas (ce qui rend inutile l'utilisation du module 'operator')? – martineau

1

Passez l'opérateur de comparaison comme paramètre. Vous pouvez passer non seulement un opérateur, mais toutes les autres fonctions - -mais "égal" et "non égal", ainsi que tous les autres opérateurs de comparaison ou d'arithmétique sont déjà définis comme des fonctions appropriées dans le module "opérateur" - votre code pourrait devenir:

import operator 

def MsgBox1_Action(sender,e, comparisson): 
    if comparisson(e.Key, "A"): function0() 
    else: 
     function1() 
     function2() 
     function3() 
MsgBox1_YesChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.eq) 
MsgBox1_NoChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.ne) 
Questions connexes