Подключение к добавлению / удалению элементов из списка в python

#python #list

#python #Список

Вопрос:

Я хотел бы создать всплывающую замену для python list , которая позволит мне знать, когда элемент добавлен или удален. Подкласс list или что-то, что реализует интерфейс list, будет работать одинаково хорошо. Я бы предпочел решение, в котором мне не нужно переопределять всю функциональность списка. Есть ли простой pythonic способ сделать это?

Псевдокод:

 class MyList(list):
    # ...
    def on_add(self, items):
        print "Added:"
        for i in items:
            print i

    # and the same for on_remove

l = MyList()
l  = [1,2,3]
# etc.
  

Комментарии:

1. Я думаю, вам нужно переопределить append , extend и (немного сложнее) __setitem__ .

2. Вместо переопределения list (что правильно, но немного сложно) вы могли бы написать небольшую оболочку над списком, реализующую только тот API, который вам нужен.

Ответ №1:

Чтобы увидеть, какие функции определены в списке, вы можете сделать

 >>> dir(list)
  

Затем вы увидите, что вы можете переопределить, попробуйте, например, это:

 class MyList(list):
    def __iadd__(self, *arg, **kwargs):
        print "Adding"
        return list.__iadd__(self, *arg, **kwargs)
  

Вероятно, вам нужно выполнить еще несколько из них, чтобы получить все это.

Комментарии:

1. __iadd__ это было. Я попробовал с __setitem__ и задавался вопросом, почему элемент управления не выполнял это.

Ответ №2:

Документация для userlist сообщает вам о создании подкласса, list если вам не требуется, чтобы ваш код работал с Python <2.2. Вероятно, вам не удастся переопределить хотя бы методы, которые позволяют добавлять / удалять элементы. Будьте осторожны, это включает в себя операторы нарезки.