[Python] Gestire eventi con callback

Alessandro Re ale a ale-re.net
Mar 10 Mar 2015 20:41:52 CET


2015-03-10 17:33 GMT+00:00 Marco Giusti <marco.giusti a posteo.de>:
> Credo che puoi fare meglio che questo. Vuoi che ogni callback venga
> invocata una sola volta?

Ah sì, che si possa far meglio è fuori di dubbio :D Comunque no, non
voglio che *ogni* callback venga invocata una sola volta.
Ma comunque ammetto che avrei potuto trovare una soluzione molto più pulita.

> Inoltre passare un oggetto come primo argomento mi suona tanto da
> antipattern. Non è sbagliato, ma chiediti che oggetto sia. Mi suona da
> antipattern per come i metodi e le funzioni in python funzionano.

> come vedi le due chiamate sono identiche ma in più il metodo riceve
> un oggetto (su cui opera il metodo). Il tuo codice sembra reinventare
> una ruota che ormai è ben collaudata.

Ok, premetto che mi è chiaro l'esempio che fai, e ci ho pensato un po'
su queste tue parole, ma non credo di aver capito cosa intendi; ti
spiace argomentare un pochino?

> Comunque l'ultima parola l'hai tu perché il codice che hai postato non
> ci aiuta molto a capire esattamente il funzionamento di questi
> fantomatici oggetti C++.

No, ecco, la questione C++ l'avete ingrandita un po' voi :P Nel senso
che sì, io ho degli oggetti C++ sottostanti, ma il punto che volevo
fare è solo che voglio che non esistano oggetti python che facciano
riferimento ad oggetti C++ ormai distrutti... C++ l'ho nominato solo
per giustificare il fatto che gli oggetti python, dopo la remove(),
dovrebbero essere cancellati ovunque. Tutto qua :)

L'unica cosa che ho omesso è che, in remove(), oltre a chiamare le
callback, io ho anche una chiamata tipo
`self._oggetto_cpp.distruggi()` e se dopo di essa provo a fare
`self._oggetto_cpp.metodo()` ottengo un bel errore :)

> PS. Le tue linee di codice sono identiche:
>
>     for obj, cb in list(it for it in self._callbacks.get(event, [])):
>     for obj, cb in self._callbacks.get(event, [])[:]:

Grazie; sì, ho presente [:], ma non mi piace molto, preferisco usare
list(), che personalmente trovo più esplicito e facile da leggere.

Ciauz
~Ale


Maggiori informazioni sulla lista Python