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