문제

ZODB는 a PersistentList 그리고 a PersistentMapping,하지만 나는 a PersistentSet. 나는 고대를 반영하는 빠른 수업을 썼습니다 PersistentList ZODB 2에서 UserSet 파이썬에서는 C 기반 내장에서 확장해야했습니다. 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

코드는 "다중베이스는 인스턴스 레이아웃 충돌"을 생성했습니다. 오류. 나는 a를 만들려고했다 UserSet 래퍼 주위 set, 그러나 그것은 문제를 해결하지 못했습니다.

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

마침내 수입했습니다 sets.Set (내장으로 대체되었습니다 set), 그러나 그것은 C에서도 구현 된 것 같습니다. PYPI에 대한 세트 구현을 찾지 못했기 때문에 지금 막 다른 골목에 있습니다.

내 옵션은 무엇입니까? 처음부터 세트를 구현하거나 사용해야 할 수도 있습니다. UserDict 그리고 모든 것을 버리십시오 value에스.

도움이 되었습니까?

해결책

제공하는 영구 세트 클래스를 사용하지 않는 이유는 무엇입니까? Btree ZODB의 라이브러리. 이러한 클래스가 4 개 있습니다. Iitreeset 및 ioTreeset 정수 세트 및 Oitreeset 및 OotReeset 세트를 관리합니다. 그것들은 각각 4 개의 btree 클래스 Iibtree, iobtree, Oibtree 및 Oobtree에 해당합니다. Python에 내장 된 세트 구현에 비해 장점은 빠른 조회 메커니즘 (Thanx to the Btree)과 지속성 지원입니다.

다음은 샘플 코드입니다.

>>> 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])

다른 팁

모든 속성 요청을 내부 세트로 전달합니다.

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

향후 독서를 위해, 나는 이미 제안 된 답변에 대해 약간의 개선을 제공하고 싶었습니다 ...

사용자 정의 영구 세트 클래스

class PersistentSet(Persistent):

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

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

라이브러리에서 지속적인 세트 클래스

from BTrees.OOBTree import OOSet

또한보십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top