Прикрепите проверку к существующему экземпляру списка Python

#python

#python

Вопрос:

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

Создание нового класса, который переопределяет __setitem__ и поддерживает при выводе из list, обеспечивает требуемую проверку (PropertyList показан ниже). Проблема в том, что другие части кода указывают на ссылку на старый список, и поскольку это часть библиотеки, я не могу попросить разработчиков учесть это (это нарушает обратную совместимость и будет перегрызать код таким образом, чтобы поначалу его было незаметно).

Могу ли я в любом случае изменить класс элемента списка «live», чтобы все ссылки на список теперь вызывали модифицированные __setitem__ методы etc?

 class PropertyList(list):

  def __init__(self, validator, *args, **kwargs):
    self.__validator = validator
    super(PropertyList, self).__init__(*args, **kwargs)

  def __setitem__(self, key, value):
    value = self.__validator(value)
    super(PropertyList, self).__setitem__(key, value)

  def append(self, value):
    value = self.__validator(value)
    super(PropertyList, self).append(value)

  def extend(self, other):
    other = map(self.__validator, other)
    super(PropertyList, self).extend(other)

  def insert(self, index, value):
    value = self.__validator(value)
    super(PropertyList, self).insert(index, value)
  

Ответ №1:

Нет, это не так. Даже если вы могли бы заменить __class__ атрибут, вам не следует пытаться это делать, это сбивает с толку и может привести к сбоям. Если вам нужно создать список проверки, вам нужно создать новый объект и использовать его вместо старого.

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

1. Я: я не могу найти способ изменения существующей ссылки на список, присвоенной повторяющемуся свойству. Гвидо ван Россум: его нет — вам нужно будет присвоить существующему списку атрибут class , но это не поддерживается для встроенных типов.