python - 实现一个带约束的 python 列表

标签 python data-structures

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

实现它的最简单/最快的方法是什么。显而易见的方法是覆盖列表数据类型的所有改变其内容的方法(appendextendinsert 等),并且验证约束在操作后仍然有效。只是这很乏味,因为有很多这样的方法。有没有更简单的方法?

最佳答案

我强烈建议从 collections.MutableSequence 抽象基类继承子类。缺点是它不会被识别为 list 的子类(如 user4815162342 指出的那样)。然而,只要使用结果类的人做的是正确的事情(即使用鸭子类型或将抽象基类而不是具体类传递给 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)

一些简单的测试:

>>> 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'])

关于python - 实现一个带约束的 python 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442981/

相关文章:

javascript - 使用 Django 使用远程数据提高 Twitter 的 typeahead.js 性能

python - Mac OS X Lion 中的 Gevent 安装错误

python - 运算符不存在 : character varying + character varying

javascript - 交叉监听多个事件并触发回调

python - Cloudflare KV API批量PUT-错误10012-无法将KVPair解码为中间结构

python - Mysql 在类中与 python 的连接

.net - 列表<T> 或链表<T>

Java设计: Polymorphic List

javascript - 如何查找与提供的 slug 匹配的某个对象的索引

mysql - 在MySQL数据库中获取链表