Question
ZODB fournit un PersistentList
et un PersistentMapping
, mais je voudrais un PersistentSet
. J'ai écrit une classe rapide qui reflète l'ancien PersistentList
de ZODB 2. Parce qu'il n'y a pas UserSet
en Python, je devais prolonger de la C-base intégrée 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
Le code produit un "plusieurs bases ont par exemple un conflit lay-out" erreur . J'ai essayé de créer une enveloppe UserSet
autour set
, mais cela n'a pas résolu le problème non plus.
class UserSet(set):
def __init__(self):
self.value = set
def __getattribute__(self, name):
return self.value.__getattribute__(name
Enfin, je sets.Set
importé (remplacé par le set
intégré), mais qui semble être mis en œuvre en C, aussi. Je ne trouve pas de mises en œuvre ensemble sur PyPI donc je suis dans une impasse maintenant.
Quelles sont mes options? je peux avoir à mettre en œuvre un ensemble à partir de zéro ou d'utiliser UserDict
et jeter tous les value
s.
La solution
Pourquoi ne pas utiliser la classe ensemble persistant fourni avec le BTree bibliothèques ZODB. Il y a 4 ces classes disponibles. IITreeSet et IOTreeSet gérer des ensembles d'entiers et OITreeSet et OOTreeSet d'objets gère des ensembles arbitraires. Ils correspondent aux quatre classes BTREE IIBTree, IOBTree, OIBTree et OOBTree respectivement. Leurs avantages par rapport à la mise en œuvre de jeu construit en Python sont leur mécanisme de recherche rapide (Thanx à l'BTree sous-jacent) et leur soutien à la persévérance.
Voici quelques exemples de code:
>>> 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])
Autres conseils
Transférer toutes les demandes d'attributs à l'ensemble interne:
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
Pour les lectures futures, je voulais juste offrir une légère amélioration par rapport aux réponses déjà proposées ...
classe PREF persistante
class PersistentSet(Persistent):
def __init__(self, *args, **kwargs):
self._set = set(*args, **kwargs)
def __getattr__(self, name):
return getattr(self._set, name)
classe persistante ensemble de la bibliothèque
from BTrees.OOBTree import OOSet
Voir aussi