Вызов функций при изменении списка в Python - PullRequest
1 голос
/ 24 сентября 2019

Я просто хотел узнать, можно ли вызывать функцию при каждом изменении списка (элемент добавляется к нему).Во всяком случае это выглядело бы так:

def listchanged():
    print("The list has been changed!")

list = ["apples","bananas"]
listevent(list,listchanged)

И в оболочке вы добавляете элемент в список и выдает «Список был изменен!»

Спасибо!

Ответы [ 2 ]

6 голосов
/ 24 сентября 2019

Вы можете создать подкласс list для печати при изменении списка.

Вот пример:

class EventList(list):

    def __setitem__(self, key, value):
        super(EventList, self).__setitem__(key, value)
        print("The list has been changed!")

    def __delitem__(self, value):
        super(EventList, self).__delitem__(value)
        print("The list has been changed!")

    def __add__(self, value):
        super(EventList, self).__add__(value)
        print("The list has been changed!")

    def __iadd__(self, value):
        super(EventList, self).__iadd__(value)
        print("The list has been changed!")

    def append(self, value):
        super(EventList, self).append(value)
        print("The list has been changed!")

    def remove(self, value):
        super(EventList, self).remove(value)

l = EventList(["apples","bananas"])
l.append('test')

Печать:

The list has been changed!

ИЛИ

Просто сравните списки:

old_list = ["apples","bananas"]
new_list = ["apples","bananas"]
newer_list = ["apples","bananas", "oranges"]

old_list == new_list #true
old_list == newer_list #false

Это будет работать без подкласса, так как == сравнивает, если списки имеют одинаковые элементы в одних и тех же признаках, а не если они точното же самое по id или хэшу (в ламенах).Просто сохраните старый в переменной, затем, когда вы хотите проверить, просто используйте это.( примечание: это не позволяет автоматически вызывать печать. Это просто другой способ )

0 голосов
/ 24 сентября 2019
def listchanged():
    print("The list has been changed!")

list = ["apples","bananas"]


def listevent():
    prev_len=len(list)

    list.append("grapes")

    new_len=len(list)

    if(prev_len!=new_len):
          listchanged()
listevent(list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...