0
0 комментариев

В Python 3.x с PEP 3106: Dictionary Views поменялось поведение словарей.

У меня есть свой класс, производный от dict, похожий по поведению на collections.OrderedDict, но отличающийся от него. В любом случае, у класса «под капотом» есть список self._ordering. Вот фрагмент, отражающий основную суть:

class TimestampingDict(dict):
    """
    An ordered dictionary, tracking item update times.
    Least recently updated items are returned first.
    """
    def __init__(self, *args, **kwargs):
        self._ordering = []
        super(TimestampingDict, self).__init__(*args, **kwargs)
 
    def __getitem__(self, key):
        _timestamp, value = super(TimestampingDict, self).__getitem__(key)
        return value
 
    def __setitem__(self, key, value):
        if key in self:
            # TODO: Speed this up with key->order_idx mapping?
            self._ordering.remove(key)
        super(TimestampingDict, self).__setitem__(key, (datetime.now(), value))
        self._ordering.append(key)
 
    def __delitem__(self):
        self._ordering.remove(key)
        super(TimestampingDict, self).__delitem__(key)
 
    def __iter__(self):
        for key in self._ordering:
            yield key

Хочется написать такой код, который будет одновременно одинаково хорошо работать и для 2.6+ и 3.x, ведя для каждой версии максимально «нативно.»

Посоветуйте, пожалуйста, как бы это сделать покрасивее, максимально DRY?

Идея запихать этот класс в отдельное яйцо-пакет и использовать setup.py с вызовом 2to3 мне откровенно не нравится.


Добавить комментарий