Pregunta

ZODB proporciona una PersistentList y una PersistentMapping, pero me gustaría un PersistentSet. Escribí una clase rápida que refleja la antigua PersistentList de ZODB 2. Porque no hay UserSet en Python, que tenía que extenderse desde la C-basada integrada set.

class PersistentSet(UserSet, Persistent):
    def __iand__(self, other):
        set.__iand__(other)
        self._p_changed = 1

    ...

    ...

    ...

    def symmetric_difference_update(self, other):
        set.symmetric_difference_update(other)
        self._p_changed = 1

El código producido un "múltiples bases tienen ejemplo conflicto lay-out" error de . He intentado crear una envoltura alrededor de UserSet set, pero eso no resuelve el problema.

class UserSet(set):
    def __init__(self):
        self.value = set
    def __getattribute__(self, name):
        return self.value.__getattribute__(name

Por último, Importé sets.Set (sustituida por la set incorporado), pero que parece ser implementado en C, también. No he encontrado ninguna implementación en conjunto PyPI así que estoy en un punto muerto ahora.

¿Cuáles son mis opciones? Puede que tenga que poner en práctica un conjunto de cero o utilizar UserDict y tirar todos los values.

¿Fue útil?

Solución

¿Por qué no se utiliza la clase persistente conjunto se suministra con el BTree bibliotecas en ZODB. Hay 4 tales clases disponibles. IITreeSet y IOTreeSet gestionar conjuntos de enteros y OITreeSet y gestionar OOTreeSet conjunto de objetos arbitrarios. Se corresponden con las cuatro clases BTree IIBTree, IOBTree, OIBTree y OOBTree respectivamente. Sus ventajas con respecto a la implementación conjunto integrado en Python son su rápido mecanismo de búsqueda (Gracias a la BTree subyacente) y su apoyo persistencia.

Aquí hay algunos ejemplos de código:

>>> from BTrees.IIBTree import IITreeSet, union, intersection
>>> a = IITreeSet([1,2,3])
>>> a
<BTrees._IIBTree.IITreeSet object at 0x00B3FF18>
>>> b = IITreeSet([4,3,2])
>>> list(a)
[1, 2, 3]
>>> list(b)
[2, 3, 4]
>>> union(a,b)
IISet([1, 2, 3, 4])
>>> intersection(a,b)
IISet([2, 3])

Otros consejos

Reenviar todas las peticiones de los atributos en el conjunto interno:

class PersistentSet(Persistent):
    def __init__(self):
        self.inner_set = set()

    def __getattribute__(self, name):
        try:
            inner_set = Persistent.__getattribute__(self, "inner_set")
            output = getattr(inner_set, name)
        except AttributeError:
            output = Persistent.__getattribute__(self, name)

        return output

Para lecturas futuras, sólo quería ofrecer una ligera mejora con respecto a las respuestas ya propuestas ...

Custom persistente clase conjunto

class PersistentSet(Persistent):

    def __init__(self, *args, **kwargs):
        self._set = set(*args, **kwargs)

    def __getattr__(self, name):
        return getattr(self._set, name)

Persistent clase conjunto de la biblioteca

from BTrees.OOBTree import OOSet

Ver también

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top