扩展python列表以在追加之前检查输入
在这种情况下,我会有很多列表,每个列表中的值都需要在一组有效值中。但是,每个列表的有效值集将不同。因此,在添加到这些列表之前,我必须检查成员资格,这会导致大量重复代码。我发现自己很想扩展list对象,这样我就不必反复检查成员资格了扩展python列表以在追加之前检查输入,python,inheritance,Python,Inheritance,在这种情况下,我会有很多列表,每个列表中的值都需要在一组有效值中。但是,每个列表的有效值集将不同。因此,在添加到这些列表之前,我必须检查成员资格,这会导致大量重复代码。我发现自己很想扩展list对象,这样我就不必反复检查成员资格了 class Attribute(list): def __init__(self,validList): self.valid = validList def append(self,inString): if inS
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
将被命名为字符串为什么不在自定义集合类中包装列表?这样,您就不必担心如何正确地实现所有其他列表方法。如果有效值
多于几个元素,您可能希望使用冻结集
而不是元组(或列表),因为这样可以更快地检查项。不过,作为警告,你真的需要有很多元素,或者这是一段性能至关重要的代码,如果有的话。而冻结设置会占用更多内存,所以这是一个折衷方案。