将验证附加到现有的Python列表实例

时间:2011-10-24 13:10:02

标签: python

我有一个现有的列表实例,它在实时代码中包含引用。当列表引用传递给某个函数时,我需要确保该列表中的所有项目从那时起都是有效的(验证所有列表项,然后附加验证以备将来的更改)。

创建一个覆盖__setitem__和朋友的新类,同时从列表派生,提供所需的验证(PropertyList如下所示)。问题是代码的其他部分指向旧的列表引用,因为这是库的一部分,我不能真的要求开发人员考虑到这一点(它打破了向后兼容性并且会以这样的方式咀嚼代码一开始并不明显。)

无论如何我可以更改列表项的“实时”类,以便对列表的所有引用现在都会调用修改后的__setitem__等方法吗?

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 个答案:

答案 0 :(得分:1)

不,没有。即使您可以替换__class__属性,也不应该尝试这样做,这会让人感到困惑并且可能会以微妙的方式破解。如果您需要创建验证列表,则需要创建一个新对象并使用该对象而不是旧对象。