[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