Re: [Python] Dubbi su hash e set

2008-05-03 Per discussione enrico franchi
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

2008-05-03 Per discussione Daniele Varrazzo
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

2008-05-03 Per discussione Mr . SpOOn
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

2008-05-03 Per discussione Daniele Varrazzo
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

2008-05-03 Per discussione enrico franchi
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

2008-05-03 Per discussione Mr . SpOOn
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