实现带有约束的python列表

gar*_*ois 10 python data-structures

我需要一个python list对象,在插入时,会自动检查表单的某些约束:"A必须始终在B之前"或"如果包含C,它必须始终最后".

实现这一目标最简单/最快捷的方法是什么.最明显的办法是重写它改变其内容(列表中的数据类型的所有方法append,extend,insert,等),并验证限制在手术后仍持有.只是因为有很多这些方法,所以这很繁琐.有没有更简单的方法?

sen*_*rle 5

我强烈建议从collections.MutableSequence抽象基类进行子类化。缺点是它不会被识别listuser4815162342的子类。但是,只要使用结果类的人做正确的事情(即使用鸭子类型或将抽象基类而不是具体类传递给isinstance),那几乎就不会有什么问题 。

这样做的妙处在于,一旦定义了以下方法,就MutableSequence可以免费获得接口的其余部分。这MutableSequence是您可以用作进一步定制的模板的具体子类。在你的情况,你应该只需要定制__init____setitem__insert,和__delitem__。其他所有内容都是根据这些定义的,因此将执行您插入的所有检查:

import collections
class MyList(collections.MutableSequence):
    def __init__(self, it=()):
        self._inner = list(it)
    def __len__(self):
        return len(self._inner)
    def __iter__(self):
        return iter(self._inner)
    def __contains__(self, item):
        return item in self._inner
    def __getitem__(self, index):
        return self._inner[index]
    def __setitem__(self, index, value):
        self._inner[index] = value
    def __delitem__(self, index):
        del self._inner[index]
    def __repr__(self):
        return 'MyList({})'.format(self._inner)
    def insert(self, index, item):
        return self._inner.insert(index, item)
Run Code Online (Sandbox Code Playgroud)

几个简单的测试:

>>> ml = MyList('foo')
>>> ml
MyList(['f', 'o', 'o'])
>>> ml.append(5)
>>> ml
MyList(['f', 'o', 'o', 5])
>>> ml.reverse()
>>> ml
MyList([5, 'o', 'o', 'f'])
Run Code Online (Sandbox Code Playgroud)