[Python] Gestire eventi con callback

Alessandro Re ale a ale-re.net
Dom 8 Mar 2015 18:24:37 CET


2015-03-08 15:12 GMT+00:00 Marco Giusti <marco.giusti a posteo.de>:
> Così come registri una callback, così la rimuovi. Se non riesci a
> definire formalmente un ciclo di vita per i tuoi oggetti, allora è
> probabile che nel tuo design qualcosa sia sbagliato.

> Fossi in te inizierei con una implementazione di questo tipo. Se è vero
> che è primitiva, le specifiche non sembrano ancora definite e trovo
> inutile andare a complicarsi troppo la vita. Scrivi un paio di test,
> vedi se il codice che viene fuori è soddisfacente o se richiede qualche
> hack non troppo elegante e parti da lì per migliorarlo.

Bene, il codice che mi hai dato è chiaro e fa decisamente il suo
lavoro, però forse questa volta stavo mirando a complicarmi la vita
senza motivo (forse, dentro di me, stavo cercando di replicare un
meccanismo "signals-and-slots")... Ma questi due consigli che mi hai
dato valgono molto: per quanto semplici, mi rimettono un po' i
prospettiva :)

> Per un momento ho creduto che "go" fosse il linguaggio. Non conosco
> nonlocal ma hai ragione se dici che c'è un errore grossolano. Più o meno
> è questo che avevo in mente, ma non avendo neanche provato il
> codice...
>
>     def send_data_blocking(data):
>         def go():
>             free_to_go[0] = True
>         free_to_go = [False]
>         send_data(data, callback=go)
>         while not free_to_go[0]:
>              sleep(0.1)

Sì, é che uso Python 3 e nonlocal sostanzialmente fa il lavoro di
global in uno scope non-globale (tipo questo caso, con una chiusura).
Evita di dover usare la lista come hai mostrato - ma stavo solo
facendo il pignolo :)

Ancora mille grazie
~Ale


Maggiori informazioni sulla lista Python