RE: [Python-es] Sobrecargar función

Hernán Martínez Foffani hernan en orgmf.com.ar
Jue Feb 10 10:59:15 CET 2005


Al final del mensaje te incluyo la clase completa.
No debería ser necesario agregar el método __deepcopy__,
y en todo caso el que expongo es ineficiente, pero
debido al bug http://www.python.org/sf/1099746 puede
ser necesario. Hay un patch en http://www.python.org/sf/1100562

-H.
--- lc.py ---
import copy

class ListDict(dict):
    def __init__(self, *args):
        self._orden = []
        dict.__init__(self, *args)

    def __setitem__(self, n, v):
        if not n in self._orden:
            self._orden.append(n)
        dict.__setitem__(self, n, v)

    def __delitem__(self, k):
        dict.__delitem__(self, k)
        self._orden.remove(k)

    def keys(self):
        return self._orden

    def values(self):
        res = []
        for item in self._orden:
            if self.has_key(item):
                res.append(self[item])
        return res

    def index(self, n):
        try:
            pos = self._orden.index(n)
        except:
            pos = -1
        return pos

    def count(self):
        return len(self._orden)

    def copy(self):
        c = ListDict(self)
        c._orden = self._orden[:]
        return c

    def __copy__(self):
	return self.copy()

    def __deepcopy__(self, *args):
	c=ListDict(copy.deepcopy(dict(self), *args))
	c._orden=self._orden[:]
	return c

def test():
    ld = ListDict()
    ld["a"] = 1
    ld2 = ld.copy()
    assert ld2 == ld
    assert not ld2 is ld
    ld3 = copy.deepcopy(ld)
    assert ld3 == ld
    assert not ld3 is ld




Más información sobre la lista de distribución Python-es