Hi,

I think that the main point of disagreement between Georg (and possibly
others) and me is summed up by the expectation of what a[M:N] behaves
like.

I imagine  the most common use of a[M:N] to be like get(dict, key) where
the programmer is already well aware that the key might not exist in the
dict. In all the times where I have used a[M:N] I have never actually
assumed that (M,N < len(a)). I always use it in the loose sense "give me
any elements between indices M and N if there are any".

On the other hand, Georg seems to want to use a[M:N] just like a[M].
In this case, the programmer is actually assuming that the array is
at least (M+1) long and therefore it is rightly an error to signal it as
such.

I think it becomes a matter of deciding which approach to list slicing
makes more sense. If Bram thinks that Georg's approach makes more sense,
I shall argue no more. I do hope however that the behavior of a[M:N] is
dictated by more thought that just likening to a[M] without any thought
given to its most common use.

Thanks,
Srinath

On 4/22/06, Srinath Avadhanula <[EMAIL PROTECTED]> wrote:
> Hi,
>
> On 4/22/06, Georg Dahn <[EMAIL PROTECTED]> wrote:
> > In my opinion one has done something wrong if one wants to get a sublist
> > whith wrong bounds. That's why an error has to be produced. Returning an
> > empty list looks like everything is ok where it is not. It takes some
> > time to find an error if no error message is produced in such cases.
>
> Why is this "wrong"? And wrong is very subjective... I can agree that
> getting a non empty slice where none exists is "wrong". Why is mereley
> querying for out-of-bounds "wrong"? By your logic, the get() function
> for dictionary objects is "wrong". The programmer should be forced to
> write an if statement every time he could have done the same thing with
> get(). A lot of time, there is an expectation of default values...
>
> Besides, as I elaborated in my previous email (and which you didn't
> address) is that returning an empty list is at least from a mathematical
> perspective correct. Your statement "returning an empty list looks like
> everything is ok" is also completely subjective. As a programmer I know
> that getting an empty list implies that my range is out of bounds. Why
> should the language get in the way with statements like "you are
> definitely doing something wrong".
>
> >  > The most common use-case for the slice operation I can think of is:
> >  >
> >  > for item in somelist[M:N]
> >  >     " do something
> >  > endfor
> >
> > This is a good example. M and N are not further described here. But M
> > and N must come from somewhere. If they are out of bounds, then in many
> > or even most cases the programmer has done something wrong. Even if
>
> Why?! Why is this "wrong"? Suppose I have a function which asks the user
> for a long list and then wants to use not more than the first three
> elements.  Or for that matter, maybe the first argument needs to be
> discarded or used differently... I can easily imagine many cases like
> this, where producing an error is needless intrusion and produces more
> complicated looking code where the intent was actually simple.
>
> A real world example is in vim-latex, where the user is expected to
> create a setting Tex_HotKeyEnvironments. This is a list of environments
> which needs to be mapped to the function keys. Since only the first
> 4 function keys should be mapped, I would have done something like:
>
> for item in Tex_HotKeyEnvironments[:3]
>     " do something
> endfor
>
> Is it an "error" for the user to specify a list less than 4 long?
> I think not!
>
> > there may be some cases where this could make sense, it will be better
> > to add an if. An error is no intrusion as you call it, but a very
> > helpful signal that there is something wrong.
>
> Once again, in many cases, the list not containing elements given in the
> range is not an error but an expected use-case. It is in these cases
> where producing an error is annoying. You can always use "if len(list)"
> statements where you actually care about the lenght of the list.
>
> >  > Having a[M:N] never be an error makes the above work flawlessly.
> >
> > What does 'flawlessly' mean here? Not to get an error is not good if
> > there is one. What may result in more harm: an additional if or writing
> > a good code, where your examples doesn't exist, or not producing an
>
> I do not thinking that stuffing code with needless if statements makes
> "good code".
>
> > But somewhere you have assigned some values to M and N. That will be
> > done dynamically, too. If they are out of bounds, a highly probable
> > reason for that is, that you have done something wrong.
> >
> In many many cases, there is no fault in logic. I fully expect that the
> list might be shorter and the
>
> for item in list[M:N]
>     " do something
> endif
>
> automatically handles this since the loop is never entered if the range
> is out of bounds.
>
> > But these languages have in common, that it is very hard to find some
> > types of errors, which can be avoided in more restricting languages.
>
> I personally feel that Python is one of the best languages around as far
> as language design goes. There are usually extremely good reasons why
> things are done the way they are. In this case, I happen to completely
> agree with it. In all the cases where I have used lists, the if
> statement will be completely redundant. I am asking for this due to
> real-word use-cases, not due to some abstract feeling of "right" or
> "wrong".
>
> Best wishes,
> Srinath
>

Reply via email to