Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 23, 2014 22:26:17

remoshka
Зарегистрирован: 2014-10-11
Сообщения: 44
Репутация: +  0  -
Профиль  

не ясен смысл присутствия декоратора. Подскажите

В чём смысл присутствия декоратора delegate и как это вообще использовать ?

attribute_name = ''
def delegate(attribute_name, method_names):
    def decorator(cls):
        global attribute_name
        if attribute_name.startswith("__"):
            attribute_name = "_" + cls.__name__ + attribute_name
            setattr(cls, name, eval("lambda self, *a, **kw: "
                                    "self.{0}.{1}(*a, **kw)".format(
                                    attribute_name, name)))
        return cls
    return decorator
_identity = lambda x: x
@delegate("__list", ("pop", "__delitem__", "__getitem__", "__iter__", "__reversed__", "__len__", "__str__"))
class SortedList(object):
    def __init__(self, sequence=None, key=None):
        self.__key = key or _identity
        assert hasattr(self.__key, "__call__")
        if sequence is None:
            self.__list = []
        elif (isinstance(sequence, SortedList) and 
                sequence.key == self.__key):
            self.__list = sequence.__list[:]
        else:
            self.__list = sorted(list(sequence), key=self.__key)
    @property
    def key(self):
        return self.__key
    def __bisect_left(self, value):
        key = self.__key(value)
        left, right = 0, len(self.__list)
        while left < right:
            middle = (left + right) // 2
            if self.__key(self.__list[middle]) < key:
                left = middle + 1
            else:
                right = middle
        return left
    def add(self, value):
        index = self.__bisect_left(value)
        if index == len(self.__list):
            self.__list.append(value)
        else:
            self.__list.insert(index, value)
    def remove(self, value):
        index = self.__bisect_left(value)
        if index < len(self.__list) and self.__list[index] == value:
            del self.__list[index]
        else:
            raise ValueError("{0}.remove(x): x not in list".format(
                self._class__.__name__))
    def remove_every(self, value):
        count = 0
        index = self.__bisect_left(value)
        while(index < len(self.__list) and
                self.__list[index] == value):
            del self.__list[index]
            count += 1
        return count
    def count(self, value):
        count = 0
        index = self.__bisect_left(value)
        while(index < len(self.__list) and
                self.__list[index] == value):
            del self.__list[index]
            index += 1
            count += 1
        return count
    def index(self, value):
        index = self.__bisect_left(value)
        if index < len(self.__list) and self.__list[index] == value:
            return index
        raise ValueError("{0}.index(x): x not in list".format(
            self.__class__.__name__))
    def __delitem__(self, index):
        del self.__list[index]
    def __getitem__(self, index):
        return self.__list[index]
    def __setitem__(self, index):
        raise TypeError("use add() to insert a value and rely on "
                "the list to put it in the right place")
    def iter(self):
        return iter(self.__list)
    def __reversed__(self):
        return reversed(self.__list)
    def __contains__(self, value):
        index = self.__bisect_left(value)
        return (index < len(self.__list) and
                self.__list[index] == value)
    def clear(self):
        self.__list = []
    def pop(self, index=-1):
        return self.__list.pop(index)
    def __len__(self):
        return len(self.__list)
    def __str__(self):
        return str(self.__list)
    def copy(self):
        return SortedList(self, self.__key)
    __copy__ = copy
letters = SortedList(("H", "c", "B", "G", "e"), str.lower)
print str(letters)
letters.add("G")
letters.add("f")
letters.add("A")
print str(letters)
print letters[2]
print '----------'
letters.pop()
print letters
# Press ENTER or type command to continue
# ['B', 'c', 'e', 'G', 'H']
# ['A', 'B', 'c', 'e', 'f', 'G', 'G', 'H']
# c
# ----------
# ['A', 'B', 'c', 'e', 'f', 'G', 'G']
# Press ENTER or type command to continue

Отредактировано remoshka (Дек. 23, 2014 22:26:58)

Офлайн

#2 Дек. 24, 2014 01:49:26

signularity
Зарегистрирован: 2014-12-23
Сообщения: 4
Репутация: +  1  -
Профиль   Отправить e-mail  

не ясен смысл присутствия декоратора. Подскажите

remoshka
remo from pythonua@c.j.r ?

Офлайн

#3 Дек. 25, 2014 05:00:14

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

не ясен смысл присутствия декоратора. Подскажите

remoshka
В чём смысл присутствия декоратора delegate и как это вообще использовать ?
Смысл в создании декоратором в декорируемом классе пачки методов, в данном случае “pop”, “__delitem__”, “__getitem__”, “__iter__”, “__reversed__”, “__len__”, “__str__”, которые вызывают одноименные методы у атрибута класса, в данном случае __list.

Только мне что-то код самого декоратора не нравится, надо будет покопать как время будет.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Дек. 25, 2014 05:01:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version