[C++-sig] vector_indexing_suite too defensive ...
Joel de Guzman
djowel at gmx.co.uk
Mon Sep 29 13:35:44 CEST 2003
Mike Thompson <mike.thompson at day8.com.au> wrote:
> I've found a small difference between the behaviour of python lists and
> vector's wrapped by using the talented vector_indexing_suite.
>
> Let's say I write a python function which forces a list to be a particular
> size by padding it (if below the required size), or chopping it down (if
> above the required size):
>
>>>> def padOrChop(lst, size, padValue=0):
> ... diff = size- len(lst)
> ... lst[size:] = [padValue] * diff
> ...
>
> This function work nicely with normal python lists ....
>
>>>>
>>>> L = [2, 3, 4, 5]
>>>> padOrChop(L, 10)
>>>> L
> [2, 3, 4, 5, 0, 0, 0, 0, 0, 0]
>>>> padOrChop(L, 2)
>>>> L
> [2, 3]
>>>>
>
> but it will fail with an object created through vector_indexing_suite whenever
> it has to pad:
>
>>>> L = IntVec() # really a vector<int>
>>>> L[:] = [2, 3, 4, 5]
>>>> padOrChop(L, 10)
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "<stdin>", line 3, in padOrChop
> IndexError: Index out of range
>>>> padOrChop(L, 2)
>>>> [i for i in L]
> [2, 3]
>>>>
>
> The IndexError arises because vector_indexing_suite defends against an slice
> index being too big, rather than the python list approach which regards a
> slice index > len(L) as equal to len(L). So, the line of padOrChop() which
> says:
>
> lst[size:] = [padValue] * diff
>
> causes an exception when size > len(lst).
>
> Should vector_indexing_suite be altered to give behaviour more like that of
> lists in this regard?
It should. I think you uncovered a vector_indexing_suite bug. I'll correct this
as soon as I can.
--
Joel de Guzman
http://www.boost-consulting.com
http://spirit.sf.net
More information about the Cplusplus-sig
mailing list