• # Python et formes fonctionnelles (reloaded)

    Posté par . En réponse au message de la puissance de (beep) pour trouver un truc simple en 2 minutes. Évalué à 2.

    Je reprends ici le thread plus haut qui devenait ingérable... Un autre exemple courant est le branchement d'un callback sur un événement : typiquement dans gtk, par exemple avec le code suivant :
    sub run_my_dialog() {
     my $results = 1;
     my $dialog = make_gtk_dialog();
     $dialog->button1()->signal_connect(clicked => sub { $results = 2 })
     $dialog->run();
     return $results;
     }
    
    La possibilité d'écrire une fonction anonyme qui soit une closure est ici particulièrement pratique pour "sauver" une valeur qui sera disponible lorsque le dialogue sera fermé. Sans closure, écrire cette fonction devient beaucoup plus lourd (tu peux l'écrire en Python ?).
    Voilà un exemple qui n'est pas une transcription littérale du code perl, mais qui je pense reste dans le même esprit ; teste-le et dis-moi ce que tu en penses:
    
    #!/usr/bin/env python
    import gtk
     
    class EntryDialog(gtk.Dialog):
     def __init__(self,message="",defaultResult=1):
     gtk.Dialog.__init__(self)
     self.result = defaultResult
     self.set_modal(gtk.TRUE)
     self.entry = gtk.Entry()
     self.entry.set_text(str(self.result))
     self.action_area.pack_start(self.entry)
     self.entry.show()
     self.entry.grab_focus()
     self.button = gtk.Button("OK")
     self.button.connect("clicked", self.click)
     self.action_area.pack_start(self.button)
     self.button.show()
     self.rButton = gtk.Button("Recommended Value")
     self.action_area.pack_start(self.rButton)
     self.rButton.show()
     def quit(self, w=None, event=None):
     self.hide()
     self.destroy()
     gtk.mainquit()
     def click(self, button):
     self.result = self.entry.get_text()
     self.quit()
     
    def runMyDialog():
     dialog = EntryDialog()
     dialog.rButton.connect('clicked',
     lambda x,d=dialog: setattr(d,'result',2) & d.quit())
     dialog.run()
     print "result=%s" % dialog.result
    if __name__=="__main__":
     runMyDialog()