s[i:j:t] = t stipulation

Terry Reedy tjreedy at udel.edu
Tue Nov 20 18:27:56 EST 2007


"Neil Cerutti" <horpner at yahoo.com> wrote in message 
news:slrnfk65hp.1mk.horpner at FIAD06.norwich.edu...
| s[i:j:t] = t (1) t must have the same length as the slice it is 
replacing.

This is essentially the same rule as requiring a proper length of t for

a,b,c = t # for whatever number of targets

And people have made similar suggestions as below for that case also.

|  Why?

A mismatch could be intentional or accidental.  In most cases of this sort, 
Python assumes 'accident', especially when intent can easily be indicated 
otherwise.

| >>> def foo():
| ...   while True:
| ...     yield 'a'
| ...
| >>> foo()
| >>> x = range(10)
| >>> x[::2] = foo()
|
| This is infinite loop due to Python building a sequence out of
| the iterator to check its length.
|
| I think it might be more useful for
|
| x[::2] = foo()
|
| to result in an x of
|
| ['a', 1, 'a', 3, 'a', 5, 'a', 7, 'a', 9]
|
| In other words, take (j-i)//k elements from t for abs(k) != 1.

Use the appropriate itertools function to take the proper number of 
elements.

| A problem, though, arises when t is too short--the sequence
| could be corrupted before an exception is thrown if you omit the
| length check.
|
| So you'd also have to define
|
| x[::2] = 'aaa'
|
| as resulting in
|
| ['a', 1, 'a', 2, 'a', 3, 5, 7, 9]

No, it should be defined as resulting in

['a', 1, 'a', 2, 'a', 3, None, 5, None, 7, None, 9] # ;-)

Or better yet, require the programmer to specify by modifying either the 
target or source spec, as is done now.

Terry Jan Reedy






More information about the Python-list mailing list