Интерфейс для версионного словаря - PullRequest
2 голосов
/ 02 октября 2008

У меня есть версионное хранилище документов, к которому я хочу получить доступ через интерфейс типа dict. Обычно используется для доступа к последней ревизии (get, set, del), но также должен быть доступ к конкретным ревизиям (ключи всегда str / unicode или int).

from UserDict import DictMixin
class VDict(DictMixin):   
    def __getitem__(self, key):
        if isinstance(key, tuple):
            docid, rev = key
        else:
            docid = key
            rev = None  # set to tip rev

        print docid, rev
        # return ...

In [1]: d = VDict()

In [2]: d[2]
2 None

In [3]: d[2, 1]
2 1

Это решение немного сложнее, и я не уверен, что это чистый, понятный интерфейс. Должен ли я предоставить функцию

def getrev(self, docid, rev):
   ...

вместо

1 Ответ

4 голосов
/ 02 октября 2008

Да, предоставьте другой API для получения разных версий. Либо единственный метод для выполнения поиска определенного элемента конкретной ревизии, либо метод для получения «представления» конкретной ревизии, к которому вы затем можете обращаться, как обычный дикт, в зависимости от того, будет ли такое «представление» вижу много пользы. Или и то, и другое, учитывая, что для решения dict-view в любом случае понадобится какой-то способ получить элемент конкретной ревизии:

class RevisionView(object):
    def __init__(self, db, revid):
        self.db = db
        self.revid = revid
    def __getitem__(self, item):
        self.db.getrev(item, self.revid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...