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

2024-09-29 01:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个情况,我会有很多列表,每个列表中的值都需要在一些有效值中。但是,对于每个列表,有效值的集合是不同的。因此,在对这些列表进行任何附加之前,我必须检查成员资格,这会导致大量重复的代码。我发现自己很想扩展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)

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

  1. 是否有一种内置的方法来实现这一点,或者有一个库已经有类似的东西了?在
  2. 这是个坏主意吗?这样做会产生什么问题?在

Overriding append method after inheriting from a Python List有助于使此代码正常工作。在


Tags: 对象代码self列表ifdefnot成员
1条回答
网友
1楼 · 发布于 2024-09-29 01:36:13

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

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

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

至于你为什么append不起作用的问题,那是因为你试图附加一个列表,而不是一个列表项。您可以通过使它list.append(inString)来解决这个问题。如果在某个时候您想将列表组合在一起,可以使用list.extend(other_list)或{}。在

另一方面,Python中的大多数人为了可读性都遵循PEP-8语法。这意味着inString将被命名为in_string。在

相关问题 更多 >