[Python] Sorting di cose senza sort()
Pietro Battiston
toobaz a email.it
Ven 17 Lug 2009 14:42:40 CEST
Il giorno ven, 17/07/2009 alle 11.19 +0200, Daniele Varrazzo ha scritto:
> On Wed, 15 Jul 2009 22:25:47 +0200, Pietro Battiston <toobaz a email.it>
> wrote:
> > Salve a tutti,
> >
> > mi confermate che il __cmp__ default della classe object fa
> > semplicemente (il confronto tra le classi, e poi) il confronto tra gli
> > id?
> >
> > Perché mi sembra così dalle prove che ho fatto, ma non l'ho trovato
> > documentato da nessuna parte.
>
> Grossomodo è così. La documentazione è qui:
> http://docs.python.org/reference/datamodel.html#object.__cmp__
>
Uh. Caspita. Non era poi inimmaginabile come locazione.
>
> > In realtà a me non me ne frega poi niente del particolare ordinamento:
> > quello di cui ho bisogno è solo che date due istanze arbitrarie "a" e
> > "b" di una stessa classe, nel corso del programma min(a,b) e min(b,a)
> > restituiscano sempre la stessa.
>
> Mi sembra che tu sia abbastanza sicuro di questo. Puoi comunque rinforzare
> e rendere esplicita la cosa definendo nella tua classe un cmp in questo
> modo:
>
> class MyClass:
> def __cmp__(self, other):
> return cmp(id(self), id(other))
>
In effetti è ciò che poi a scanso di equivoci avevo poi fatto, senza
pensare a quel che dici sotto.
> Nota che, esplicito o meno, questo ordinamento è stabile solo a parità di
> id: non è sicuro ad esempio se fai un pickle/unpickle degli oggetti (il
> che può avvenire silenziosamente ad es. serializzando gli oggetti per
> passarli ad un altro processo o cacharli in memcached).
>
> Se vuoi essere sicuro anche contro il pickling potresti usare un id univoco
> da incrementare ad ogni istanza, tipo:
>
> import itertools
>
> class MyClass:
> __cmp_counter = itertools.count().next
>
> def __init__(self):
> self.__cmp_id = self.__cmp_counter()
>
> def __cmp__(self, other):
> return cmp(self.__cmp_id, other.__cmp_id)
>
Carino, già. Soluzione adottata.
grazie ancora
Pietro
Maggiori informazioni sulla lista
Python