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 values.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top