Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展python列表以在追加之前检查输入_Python_Inheritance - Fatal编程技术网

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

扩展python列表以在追加之前检查输入,python,inheritance,Python,Inheritance,在这种情况下,我会有很多列表,每个列表中的值都需要在一组有效值中。但是,每个列表的有效值集将不同。因此,在添加到这些列表之前,我必须检查成员资格,这会导致大量重复代码。我发现自己很想扩展list对象,这样我就不必反复检查成员资格了 class Attribute(list): def __init__(self,validList): self.valid = validList def append(self,inString): if inS

在这种情况下,我会有很多列表,每个列表中的值都需要在一组有效值中。但是,每个列表的有效值集将不同。因此,在添加到这些列表之前,我必须检查成员资格,这会导致大量重复代码。我发现自己很想扩展list对象,这样我就不必反复检查成员资格了

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)
这样我就可以让我的每个列表都有一组不同的有效值。但是,我觉得扩展内置对象通常不是一个好主意,过去我一直避免这样做。所以我的问题是

  • 有没有一种内置的方法可以做到这一点,或者有没有一个库已经有了类似的东西
  • 这是个坏主意吗?这样做可能会产生什么问题

  • 有助于使此代码正常工作。

    我想您可以选择任何一种方式,但通常我避免将列表子类化。例如,我可能创建自己的集合对象,而不是子类化

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

    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
    将被命名为
    字符串

    为什么不在自定义集合类中包装列表?这样,您就不必担心如何正确地实现所有其他列表方法。如果
    有效值
    多于几个元素,您可能希望使用
    冻结集
    而不是元组(或列表),因为这样可以更快地检查项。不过,作为警告,你真的需要有很多元素,或者这是一段性能至关重要的代码,如果有的话。而冻结设置会占用更多内存,所以这是一个折衷方案。