Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione Pietro Battiston
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

enrico franchi ha scritto:
> 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...").

OK, allora i miei scrupoli erano ingiustificati e stavo effettivamente
agendo "legalmente". Quindi?!

>>  "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).

In realtà qualche osservazione empirica mi fa pensare che in caso di
__hash__ non definita, hash(x) = id(x). Comunque ho afferrato il concetto.


>>  Qualcunque schiarimento è graditissimo, scusate la chilometricità
>>  della mail.
>
> Io tutt'ora non ho capito quale sia il tuo problema.

Il mio problema è quello che avevo scritto all'inizio:


In [6]: [v for v in penta.v][0] in  penta.v
Out[6]: False

Il primo elemento di penta.v è, evidentemente, in penta.v. Perché
risponde False?!?

Daniele, che ringrazio e di cui condenso la risposta in una sola email
per praticità di lettura, ha risposto:


Daniele Varrazzo ha scritto:
> 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.

In effetti i miei oggetti non sono immutabili. Ma non capisco come
questo primo elemento di penta.v potrebbe essere modificato dalla sola
operazione di estrazione da un insieme che lo contiene. E se anche per
assurdo fosse possibile, il seguente output:

In [12]: hash([v for v in penta.v][0])
Out[12]: 0

In [14]: map(hash, penta.v)
Out[14]: [0, 5, 8, 11, 14, 17, 22, 25, 28, 0]


mi conferma che non c'è stato proprio nessun cambiamento, perlomeno
nel valore di hash. Anche se mi rendo conto che se un cambiamento c'è,
potrebbe essere avvenuto in entrambi i casi nel momento di iterare
sull'insieme. Ma di nuovo: cosa potrebbe mai cambiare?!



>> (N.B: la funzione __hash__  di "vertex" l'ho ridefinita io)
>
> Come hai definito l'hash? Questa è l'informazione più importante.

Per com'è fatta, non chiarirebbe granché. Eccovi quindi tutta la
classe, tanto è piccolina:

class vertex(set):
valid = True
def __init__(self, *args):
set.__init__(self,*args)
self.ID = new_ID()
 
def __hash__(self):
return self.ID

def delete(self):
'''
Doesn't really delete a vertex: it
marks it as deletable.
'''
self.clear()
self.ID = 0
self.valid = False

def __repr__(self):
return "(vertex %d - edges %s)" % (self.ID,
list.__repr__([e.ID for e in self]))

new_ID() è un generatore che restituisce i numeri naturali in ordine.
Quindi ogni istanza della classe ha un valore di hash diverso, tranne
quelle su cui è stato chiamato "delete", che restituiscono 0.

N.B: ho ridefinito __hash__ proprio perché "set objects are unhashable"


>
>> 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.
>


Lo immaginavo. Ma la performance in questo caso non mi preoccupa,
perché gli elementi con hash=0 (e quindi uguale tra di loro) nei miei
programmini sono pochi e hanno vita breve.
 
 
> 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()

Grazie mille... 

Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione Daniele Varrazzo
Pietro Battiston ha scritto:

> Daniele Varrazzo ha scritto:
>> 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.
> 
> In effetti i miei oggetti non sono immutabili. Ma non capisco come
> questo primo elemento di penta.v potrebbe essere modificato dalla sola
> operazione di estrazione da un insieme che lo contiene. E se anche per
> assurdo fosse possibile, il seguente output:
> 
> In [12]: hash([v for v in penta.v][0])
> Out[12]: 0
> 
> In [14]: map(hash, penta.v)
> Out[14]: [0, 5, 8, 11, 14, 17, 22, 25, 28, 0]
> 
> 
> mi conferma che non c'è stato proprio nessun cambiamento, perlomeno
> nel valore di hash. Anche se mi rendo conto che se un cambiamento c'è,
> potrebbe essere avvenuto in entrambi i casi nel momento di iterare
> sull'insieme. Ma di nuovo: cosa potrebbe mai cambiare?!

Probabilmente il "primo" (quello corrispondente a list(penta)[0]) elemento 
dell'insieme è stato messo nell'insieme prima di essere cancellato (quando il 
suo hash era != 0). Non ho potuto controllare il codice perché la url di 
"poly.txt" che hai allegato in fondo al messaggio è rotta.

> new_ID() è un generatore che restituisce i numeri naturali in ordine.
> Quindi ogni istanza della classe ha un valore di hash diverso, tranne
> quelle su cui è stato chiamato "delete", che restituiscono 0.

Forse non ti è chiaro come funziona un dizionario e perchè i set (o le liste) 
non siano hashabili (un motivo c'è, non è un limite arbitrario!)

Un dict (un set è uguale, puoi vederlo come un dict in cui le chiavi e i 
valori sono uguali) è una struttura di dati divisa in "secchi" (bin). 
L'inserimento di un oggetto in un dict consiste in:

- scegliere il bin - e questo si fa leggendo l'hash della chiave.
- inserire l'oggetto nel bin (potrebbe non essere il solo: diciamo
   che ogni bin è una lista)

La ricerca di una chiave consiste invece in:

- scegliere il bin come sopra - estraendo l'hash della chiave
- cercare in tutti gli oggetti nel bin quello che ha la chiave uguale.
   Se lo trovi, hai trovato l'oggetto

Secondo me tu metti un oggetto nel set, poi ne chiami delete(). Riesci a 
vedere che succede? Lo stesso oggetto ha cambiato hash (si vede perché è 0: 
vuol dire che ne hai chiamato delete()), il che vuol dire che, inserito nel 
dict, sarebbe finito in un secchio diverso. Per questo la ricerca fallisce: 
quando testi "elemento in insieme" dove hash(elemento) == 0 ma hash(elemento) 
era != 0 quando ce l'avevi messo, cerchi probabilmente l'elemento nel bin 
sbagliato. E non lo trovi.

>> 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()
> 
> Grazie mille... adesso almeno ho comando più semplice su cui impazzire:

LOL :)

Quello che fai con iter(insieme) (o gli altri modi diversi di iterare sul 
dict) non è una ricerca per chiave, ma una navigazione in tutto il contenuto, 
operazione che non consiste nella lettura dell'hash e che funziona anche nel 
tuo set, che è in uno stato inconsistente. Ma nel momento in cui usi 
l'operatore "in" stai facendo una ricerca per chave: se l'hash è cambiato, e 
con esso il bin, l'oggetto non viene trovato nel dict.

> Ma c'è di peggio:
> ...
> 
> Ovvero il solo atto di "poppare" un elemento e rimetterlo
> immediatamente nell'insieme cambia qualcosa ed elimina il mio problema!

Forse ora ti è chiaro perchè. pop() non usa le chiavi, ma tira fuori il primo 
che gli capita (come iter()). L'oggetto viene rimosso dal set. Quando fai 
add(), l'hash dell'oggetto viene ricalcolato e il bin viene aggiornato: il 
dict è tornato in stato consistente (ma può sempre tornare inconsistente!)

Insomma, se vuoi usare oggetti come chiavi, non c'è nessun'altra possibilità 
se non quella di avere chiavi immutabili. Per questo set e list non possono 
esserlo ma tuple si. Nota anche che esiste frozenset che è un insieme 
immutabile e pensato appositamente per essere hashabile.

La magia dell'accesso o(1) dei dict e dei set è condizionata dal fatto che 
deve essere possibile calcolare un hash sulle chiavi, e che questo hash sia 
immutabile. Nota che anche il "valore" delle chiavi (quello che tu usi per 
comparare con uguaglianza, quando dici o1 == o2) deve essere altrettanto 
immutabile. Altre proprietà delle chiavi possono cambiare, ma non quelle che 
usi per implementare __hash__() ed __eq__(). Se queste condizioni non si 
applicano ai tuoi oggetti, devi mettere gli oggetti in una lista ed 
accontentarti di una ricerca o(n) su di essi.

Ti sembra un limite arbitrario? diciamo che tu sei furbo, non conosci gli hash 
ma le tue chiavi sono ordinabili. Allora implementi una bella ricerca per 
bisezione su una lista ordinata. Perchè la ricerca funzioni de

Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione Pietro Battiston
Daniele Varrazzo ha scritto:
> Pietro Battiston ha scritto:
>
>   
>> Daniele Varrazzo ha scritto:
>> 
>>> 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.
>>>   
>> In effetti i miei oggetti non sono immutabili. Ma non capisco come
>> questo primo elemento di penta.v potrebbe essere modificato dalla sola
>> operazione di estrazione da un insieme che lo contiene. E se anche per
>> assurdo fosse possibile, il seguente output:
>>
>> In [12]: hash([v for v in penta.v][0])
>> Out[12]: 0
>>
>> In [14]: map(hash, penta.v)
>> Out[14]: [0, 5, 8, 11, 14, 17, 22, 25, 28, 0]
>>
>>
>> mi conferma che non c'è stato proprio nessun cambiamento, perlomeno
>> nel valore di hash. Anche se mi rendo conto che se un cambiamento c'è,
>> potrebbe essere avvenuto in entrambi i casi nel momento di iterare
>> sull'insieme. Ma di nuovo: cosa potrebbe mai cambiare?!
>> 
>
> Probabilmente il "primo" (quello corrispondente a list(penta)[0]) elemento 
> dell'insieme è stato messo nell'insieme prima di essere cancellato (quando il 
> suo hash era != 0). Non ho potuto controllare il codice perché la url di 
> "poly.txt" che hai allegato in fondo al messaggio è rotta.
>   

... ma ti garantisco che è in effetti era proprio come dici tu!


>> new_ID() è un generatore che restituisce i numeri naturali in ordine.
>> Quindi ogni istanza della classe ha un valore di hash diverso, tranne
>> quelle su cui è stato chiamato "delete", che restituiscono 0.
>> 
>
> Forse non ti è chiaro come funziona un dizionario e perchè i set (o le liste) 
> non siano hashabili (un motivo c'è, non è un limite arbitrario!)
>   

Mi ero risposto che se un set fosse stato hashabile avrebbe potuto
contenere anche se stesso, per cui le funzioni __hash__ e soprattutto
__repr__ ed __eq__ avrebbero avuto seri problemi. In realtà poi mi sono
accorto che forzando una funzione __hash__ stupida su liste e set,
l'interprete maneggia in modo egregio la ricorsività "infinita".

> Secondo me tu metti un oggetto nel set, poi ne chiami delete(). Riesci a 
> vedere che succede?

Sì. E il bello è che come funziona una hash table lo sapevo. Solo che mi
illudevo che questo meccanismo fosse un modo per fare una prima ricerca,
seguita, in caso di fallimento, da una eventuale ricerca in tempo O(n).
Cosa che invece - ma ci ho pensato solo a posteriori - non avrebbe senso
perché ogni "in" che restituisca False prenderebbe O(n) tempo.

>> Ma c'è di peggio:
>> ...
>>
>> Ovvero il solo atto di "poppare" un elemento e rimetterlo
>> immediatamente nell'insieme cambia qualcosa ed elimina il mio problema!
>> 
>
> Forse ora ti è chiaro perchè.

Già.

> pop() non usa le chiavi, ma tira fuori il primo 
> che gli capita (come iter()). L'oggetto viene rimosso dal set. Quando fai 
> add(), l'hash dell'oggetto viene ricalcolato e il bin viene aggiornato: il 
> dict è tornato in stato consistente (ma può sempre tornare inconsistente!)
>   

... per giunta nel mio caso ci restava inconsistente, perché c'era un
altro elemento simile; però tanto bastava a darmi la risposta che mi
faceva felice...

> Per questo set e list non possono 
> esserlo ma tuple si. Nota anche che esiste frozenset che è un insieme 
> immutabile e pensato appositamente per essere hashabile.
>   

In realtà poi al mio codice bastava una modifica minima: evitare che
"delete" azzeri self.ID: gli oggetti rimangono non immutabili ma il
valore di hash è dato dalla loro "parte immutabile".

> Tutto chiaro?
>   

Ora sì, grazie mille!

Pietro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Consiglio su utilizzo di variabili globali

2008-05-04 Per discussione enrico franchi
On Sat, May 3, 2008 at 4:33 PM, Mr. SpOOn <[EMAIL PROTECTED]> wrote:

>  In effetti avevo pensato proprio a una cosa simile. Come mai è meglio
>  lasciarli perdere?

Perchè non fanno assolutamente nulla. Se devi scrivere una funzione
per fare un assegnamento, scrivi l'assegnamento e basta.
Quella dei setter/getter banali è una mania dei Javisti che sarebbe
bene non fare proliferare ulteriormente.




-- 
-enrico
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Parsing output dei comandi

2008-05-04 Per discussione enrico franchi
2008/5/1 Mattia <[EMAIL PROTECTED]>:

>  Vorrei provare questa strada. Se hai dei link da passare che hai
>  trovato particolarmente interessanti...

Io userei PLY. Ma mi sa che sono biased, eh.

-- 
-enrico
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione Daniele Varrazzo
Pietro Battiston ha scritto:

> In realtà poi al mio codice bastava una modifica minima: evitare che
> "delete" azzeri self.ID: gli oggetti rimangono non immutabili ma il
> valore di hash è dato dalla loro "parte immutabile".

Già, ma in questo caso l'uguaglianza è data dal contenuto (usi set.__eq__). 
Quindi puoi avere due oggetti uguali ma con hash diverso, che è contrario alla 
semantica che dict si aspetta dall'hash (due oggetti uguali devono avere lo 
stesso hash).

Quindi non sono sicuro che tu abbia risolto il tuo problema, a meno che non 
implementi anche:

 def __eq__(self, other):
 return self.ID == other.ID

(e tanto vale usare la funzione id() a questo punto).

-- 
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-04 Per discussione Daniele Varrazzo
enrico franchi ha scritto:
> On Sat, May 3, 2008 at 4:33 PM, Mr. SpOOn <[EMAIL PROTECTED]> wrote:
> 
>>  In effetti avevo pensato proprio a una cosa simile. Come mai è meglio
>>  lasciarli perdere?
> 
> Perchè non fanno assolutamente nulla. Se devi scrivere una funzione
> per fare un assegnamento, scrivi l'assegnamento e basta.
> Quella dei setter/getter banali è una mania dei Javisti che sarebbe
> bene non fare proliferare ulteriormente.

Penserei la stessa cose se stesse accedendo alla proprietà di un oggetto, per 
cui usi direttamente la variabile e, quando questo non ti basta più, puoi 
sostituirla con una proprietà.

Ma una variabile di modulo non puoi sostituirla con una proprietà, quindi io 
mi terrei stretto il getter. Ci sono un sacco di situazioni in cui fa comodo:

- inizializzare il valore al suo primo accesso
- consentire la lettura ma non la scrittura
- serializzare gli accessi

...eccetera.

-- 
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] Dubbi su hash e set

2008-05-04 Per discussione Pietro Battiston
Daniele Varrazzo ha scritto:
> Pietro Battiston ha scritto:
>
>   
>> In realtà poi al mio codice bastava una modifica minima: evitare che
>> "delete" azzeri self.ID: gli oggetti rimangono non immutabili ma il
>> valore di hash è dato dalla loro "parte immutabile".
>> 
>
> Già, ma in questo caso l'uguaglianza è data dal contenuto (usi set.__eq__). 
> Quindi puoi avere due oggetti uguali ma con hash diverso, che è contrario 
> alla 
> semantica che dict si aspetta dall'hash (due oggetti uguali devono avere lo 
> stesso hash).
>
> Quindi non sono sicuro che tu abbia risolto il tuo problema, a meno che non 
> implementi anche:
>
>  def __eq__(self, other):
>  return self.ID == other.ID
>
> (e tanto vale usare la funzione id() a questo punto).
>   

Già, che stolto. Hai probabilmente scongiurato anticipatamente una mia
altra disperata richiesta ...

Pietro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Consiglio su utilizzo di variabili globali

2008-05-04 Per discussione Mr . SpOOn
On Sun, May 4, 2008 at 4:14 PM, enrico franchi <[EMAIL PROTECTED]> wrote:
> On Sat, May 3, 2008 at 4:33 PM, Mr. SpOOn <[EMAIL PROTECTED]> wrote:
>
>  >  In effetti avevo pensato proprio a una cosa simile. Come mai è meglio
>  >  lasciarli perdere?
>
>  Perchè non fanno assolutamente nulla. Se devi scrivere una funzione
>  per fare un assegnamento, scrivi l'assegnamento e basta.
>  Quella dei setter/getter banali è una mania dei Javisti che sarebbe
>  bene non fare proliferare ulteriormente.

E' vero. Non per niente sono stato abituato a programmare in Java -_-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Consiglio su utilizzo di variabili globali

2008-05-04 Per discussione enrico franchi
>  Ma una variabile di modulo non puoi sostituirla con una proprietà, quindi io
>  mi terrei stretto il getter. Ci sono un sacco di situazioni in cui fa comodo:
>
>  - inizializzare il valore al suo primo accesso
>  - consentire la lettura ma non la scrittura
>  - serializzare gli accessi
>
>  ...eccetera.

Si, ma tutte queste cose mi fanno pensare che sia più appropriato un
refactoring del tutto.

Tipicamente questa qui IMHO si sta candidando per finire dentro una
classe che gestisce lei il tutto. Direi che ancora una volta il
pattern Borg è proprio il candidato ideale.

-- 
-enrico
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione enrico franchi
2008/5/4 Pietro Battiston <[EMAIL PROTECTED]>:
> -BEGIN PGP SIGNED MESSAGE-
>  Hash: SHA1
>
>  enrico franchi ha scritto:
>
> > 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...").
>
>  OK, allora i miei scrupoli erano ingiustificati e stavo effettivamente
>  agendo "legalmente". Quindi?!
>
>
>  >>  "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).
>
>  In realtà qualche osservazione empirica mi fa pensare che in caso di
>  __hash__ non definita, hash(x) = id(x). Comunque ho afferrato il concetto.

Si, hai ragione tu, presente quando uno pensa una cosa e ne scrive
un'altra (e ho pure fatto l'esperimento). Vabbè.

Comunque non è che __hash__ non è definita, poichè viene ereditata da object.
Ed in effetti id è un buon candidato per essere un valore di hash di
default, visto e considerato che:
1. non cambia durante la vita dell'oggetto
2. è sempre univoco.

Peccato che sia 'troppo' univoco. Due oggetti sensatamente uguali
risultano con hash diverso, che non è quello che vuoi per usarli come
chiavi di un dizionario.

Comunque confermo quello che ha scritto altrove Daniele: devi definire
anche __eq__ oppure __cmp__.
Quello risolverà i tuoi problemi.

Stilisticamente aggiungo: trovo spesso e volentieri poco saggio
ereditare da classi built-in che non necessariamente sono state
pensate per questo scopo. Hai spesso sorprese di vario genere e devi
stare venti volte più attento che usando semplice contenimento.

class my_list(list):
pass


s1 = my_list()
s2 = my_list()
s3 = s1 + s2

print "s3:", type(s3)
-> list

Per dire. Questa è una cosa difficile da prevedere e può romperti di
brutto il codice. Con set pare essere più robusto ma "è culo". Io
fossi in te penserei il tutto in termini di contenimento, scrivi
pochissimo codice in più, ma hai molto più controllo e meno sorprese.


-- 
-enrico
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione Pietro Battiston
enrico franchi ha scritto:
> class my_list(list):
> pass
>
>
> s1 = my_list()
> s2 = my_list()
> s3 = s1 + s2
>
> print "s3:", type(s3)
> -> list
>
> Per dire. Questa è una cosa difficile da prevedere e può romperti di
> brutto il codice. Con set pare essere più robusto ma "è culo". Io
> fossi in te penserei il tutto in termini di contenimento,

ovvero?!

Intendi "classe non derivata che ha come attributo un set"?

In effetti mi farei meno paranoie sulla classe, ma mi dovrei fare più
paranoie in giro per il programma in cui questa classe è usata, per cui
preferisco spendere un pochettino di tempo in più a controllare che
tutto sia OK (una volta, ovviamente, che so come tutto dovrebbe funzionare).

(O intendi qualcos'altro? Io per ora del tipo "set" sto usando update,
remove, add, metodi che non vorrei dover ridefinire)

Pietro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Consiglio su utilizzo di variabili globali

2008-05-04 Per discussione Y3s

Il giorno 04/mag/08, alle ore 16:14, enrico franchi ha scritto:

> On Sat, May 3, 2008 at 4:33 PM, Mr. SpOOn <[EMAIL PROTECTED]>  
> wrote:
>
>>  In effetti avevo pensato proprio a una cosa simile. Come mai è  
>> meglio
>>  lasciarli perdere?
>
> Perchè non fanno assolutamente nulla. Se devi scrivere una funzione
> per fare un assegnamento, scrivi l'assegnamento e basta.
> Quella dei setter/getter banali è una mania dei Javisti che sarebbe
> bene non fare proliferare ulteriormente.


In java tipicamente HA senso, visto che rifattorizzare ha un costo  
immensamente piu'alto che in linguaggi agili...poi con le  
"simpaticissime" regole di visibilita' e i minimo 5 livelli di  
gerarchia di classi tipici, tantovale far fare il proprio mestiere a  
eclipse/netbeans/quellochee' ;-)
In python naturalmente ha ben poco senso, vista la presenza delle  
property e vista la facilita' di refactoring...

--
Antonio Valente


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Dubbi su hash e set

2008-05-04 Per discussione enrico franchi
On Sun, May 4, 2008 at 7:20 PM, Pietro Battiston <[EMAIL PROTECTED]> wrote:

>  (O intendi qualcos'altro? Io per ora del tipo "set" sto usando update,
>  remove, add, metodi che non vorrei dover ridefinire)

E non ridefinirli. Delegali.


-- 
-enrico
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python