扩展python列表以在追加之前检查输入

时间:2013-07-03 16:23:36

标签: python inheritance

我有一种情况,我将有很多列表,每个列表中的值需要在一组有效值中。但是,每个列表的有效值集合将不同。因此,在做任何附加到这些列表之前,我必须检查成员资格,并且这会产生大量重复的代码。我发现自己很想扩展列表对象,以便我不必一遍又一遍地进行会员检查。

class Attribute(list):
    def __init__(self,validList):
        self.valid = validList

    def append(self,inString):
        if inString not in self.valid:
            raise Exception, '%s is not a valid value for this attribute' % inString
        if inString not in self:
            super(Attribute,self).append(inString)

这样我可以让每个列表都有一组不同的有效值。但是,我觉得扩展内置对象通常不是一个好主意,我过去一直避免使用它。所以我的问题是

  1. 是否有内置方法可以执行此操作,或者是否有类似于此类的库?
  2. 这是个坏主意吗?做这样的事可能会引起什么问题?
  3. Overriding append method after inheriting from a Python List有助于使此代码有效。

1 个答案:

答案 0 :(得分:2)

我猜你可以去任何一种方式,但通常我会避免继承子列表。例如,我可能会创建自己的集合对象而不是子类化。

在您的情况下,我会过滤每个列表以检查成员资格。除非您处理大量记录集,否则可能不是问题。

list.append(1)
list.append(2)
list.append(3)
# list = [1, 2, 3]

valid_values = (2, 3)

list = [item for item in list if item in valid_values]
# list = [2, 3] now

关于为什么追加不起作用的问题,这是因为你试图追加一个列表,而不是一个列表项。您可以通过将其设为list.append(inString)来解决此问题。如果您希望实际将列表组合在一起,则可以使用list.extend(other_list)list + other_list

另外,Python中的大多数人都遵循PEP-8语法以提高可读性。这意味着inString将被命名为in_string