<p>这是python的<code>list</code>的扩展版本。它的行为类似于<code>list</code>,但是如果超过长度,它将提高<code>BoundExceedError</code>(在python 2.7中尝试过):</p>
<pre><code>class BoundExceedError(Exception):
pass
class BoundList(list):
def __init__(self, *args, **kwargs):
self.length = kwargs.pop('length', None)
super(BoundList, self).__init__(*args, **kwargs)
def _check_item_bound(self):
if self.length and len(self) >= self.length:
raise BoundExceedError()
def _check_list_bound(self, L):
if self.length and len(self) + len(L) > self.length:
raise BoundExceedError()
def append(self, x):
self._check_item_bound()
return super(BoundList, self).append(x)
def extend(self, L):
self._check_list_bound(L)
return super(BoundList, self).extend(L)
def insert(self, i, x):
self._check_item_bound()
return super(BoundList, self).insert(i, x)
def __add__(self, L):
self._check_list_bound(L)
return super(BoundList, self).__add__(L)
def __iadd__(self, L):
self._check_list_bound(L)
return super(BoundList, self).__iadd__(L)
def __setslice__(self, *args, **kwargs):
if len(args) > 2 and self.length:
left, right, L = args[0], args[1], args[2]
if right > self.length:
if left + len(L) > self.length:
raise BoundExceedError()
else:
len_del = (right - left)
len_add = len(L)
if len(self) - len_del + len_add > self.length:
raise BoundExceedError()
return super(BoundList, self).__setslice__(*args, **kwargs)
</code></pre>
<p><strong>用法</strong>:</p>
<pre><code>>>> l = BoundList(length=10)
>>> l.extend([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> # now all these attempts will raise BoundExceedError:
>>> l.append(11)
>>> l.insert(0, 11)
>>> l.extend([11])
>>> l += [11]
>>> l + [11]
>>> l[len(l):] = [11]
</code></pre>