Re: [Python] Dubbi su hash e set
On Fri, May 2, 2008 at 8:46 PM, Pietro Battiston <[EMAIL PROTECTED]> wrote: > Ora, la mia coscienza sporca mi suggerisce che forse quando ho > sovrascritto __hash__ ho fatto più di quanto dovrebbe fare uno che di > internal Python non ne sa abbastanza, e che le hash di tutti gli > oggetti che conosco sono (solitamente) univoche. Ma... Non è questione di internals. E' questione di algoritmi. Devi definire una funzione (quasi) univoca sugli oggetti che a te interessano. La proprietà è che se hash(x) == hash(y) per te x e y devono essere uguali e che possibilmente se devono essere diversi non abbiano lo stesso hash (che vuole dire "è estremamente poco probabile che..."). > "not necessarily true" non significa che dovrebbe alla fine fregarsene > se in un insieme due elementi distinti (e peraltro identici in tutto > tranne l'allocazione di memoria) hanno la stessa hash?! Dice chiaramente: due valori con lo stesso valore hanno anche lo stesso hash, due valori con diverso hash potrebbero avere lo stesso valore (o anche no). E' frequente: per esempio se crei una classe "vuota" tutte le sue istanze avranno lo stesso hash (se la prova non mi inganna). > Qualcunque schiarimento è graditissimo, scusate la chilometricità > della mail. Io tutt'ora non ho capito quale sia il tuo problema. -- -enrico ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Dubbi su hash e set
Pietro Battiston ha scritto: > -BEGIN PGP SIGNED MESSAGE- > Hash: SHA1 > > Ho un comando (o piuttosto il suo output) che minaccia la mia sanità > mentale: > > In [6]: [v for v in penta.v][0] in penta.v > Out[6]: False > > , dove: > > In [7]: type(penta.v) > Out[7]: > > Chiedo se un elemento di un insieme sta nella lista degli elementi di > quell'insieme e la risposta è "False"?!? Evidentemente c'è qualcosa di > grosso che mi sfugge del tipo "set", ma cosa?! Gli oggetti nel tuo insieme dovrebbero essere immutabili. Se cambi un oggetto, e come conseguenza del cambiamento il suo hash cambia, hai tranqillamente una situazione come quella indicata. > (N.B: la funzione __hash__ di "vertex" l'ho ridefinita io) Come hai definito l'hash? Questa è l'informazione più importante. > hash(object) -> integer > > Return a hash value for the object. Two objects with the same > value have > the same hash value. The reverse is not necessarily true, but likely. > > > "not necessarily true" non significa che dovrebbe alla fine fregarsene > se in un insieme due elementi distinti (e peraltro identici in tutto > tranne l'allocazione di memoria) hanno la stessa hash?! Quante più collisioni ci sono, tanto più l'accesso alla mappa smetterà di essere o(1) e diventerà o(n). Se tutti gli oggetti hanno lo stesso hash, cercare in un dizionario che ha tali oggetti per chiave è come cercare per uguaglianza in una lista non ordinata. > Già che ci sono: c'è un modo più semplice/furbo di: > > elemento = [v for v in insieme][0] > oppure: > elemento = insieme.pop(); insieme.add(elemento) > > per ottenere un qualsiasi elemento di un insieme dato tenendolo > nell'insieme? Ad esempio iter(insieme).next() -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Consiglio su utilizzo di variabili globali
Salve, in un'applicazione Python ho bisogno di utilizzare un paio di variabili che in ogni momento devono avere un unico valore accessibile diciamo in ogni parte del codice. Quale potrebbe essere il metodo più corretto in Python per realizzare qualcosa del genere? E' lecito mettere le variabili al di fuori di qualsiasi classe e modificarle con metodi get e set? C'è qualche altra pratica consigliata o più efficace? Grazie. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Consiglio su utilizzo di variabili globali
Mr.SpOOn ha scritto: > Salve, > in un'applicazione Python ho bisogno di utilizzare un paio di > variabili che in ogni momento devono avere un unico valore accessibile > diciamo in ogni parte del codice. > > Quale potrebbe essere il metodo più corretto in Python per realizzare > qualcosa del genere? > E' lecito mettere le variabili al di fuori di qualsiasi classe e > modificarle con metodi get e set? C'è qualche altra pratica > consigliata o più efficace? Se proprio devi, usare una variabile di modulo e consertirne l'accesso con un paio di funzioni esportate dal modulo stesso va bene. -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Consiglio su utilizzo di variabili globali
On Sat, May 3, 2008 at 3:18 PM, Mr. SpOOn <[EMAIL PROTECTED]> wrote: > Quale potrebbe essere il metodo più corretto in Python per realizzare > qualcosa del genere? Dipende dalla dimensione dell'applicazione e da "quanto è pubblico" il tuo modulo. Tipicamente meno moduli se lo filano e meno devi stare attento a certe cose: se invece è un modulo molto utilizzato da altri moduli... pensaci bene. > E' lecito mettere le variabili al di fuori di qualsiasi classe e > modificarle con metodi get e set? Semmai bisogna chiedersi cosa fanno suddetti get e set: se sono 'banali' def get_foo(): return foo def set_foo(v): foo = v allora lasciali pure perdere. > C'è qualche altra pratica > consigliata o più efficace? Io potrei suggerirti di prendere in considerazione il pattern Monostate/Borg (fra i pythonisti è noto come Borg storicamente, ma di fatto è quello che altri chiamano Monostate). -- -enrico ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Consiglio su utilizzo di variabili globali
On Sat, May 3, 2008 at 4:11 PM, enrico franchi <[EMAIL PROTECTED]> wrote: > Semmai bisogna chiedersi cosa fanno suddetti get e set: se sono 'banali' > > def get_foo(): return foo > def set_foo(v): foo = v > > allora lasciali pure perdere. In effetti avevo pensato proprio a una cosa simile. Come mai è meglio lasciarli perdere? > Io potrei suggerirti di prendere in considerazione il pattern > Monostate/Borg (fra i pythonisti è noto come Borg storicamente, ma di > fatto è quello che altri chiamano Monostate). Sì, ne avevo sentito parlare. Mi sa che darò un'occhiata a questa soluzione. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python