[Python-ideas] Allow callables in slices

Steven D'Aprano steve at pearwood.info
Sat Jun 9 05:47:57 EDT 2018


On Sat, Jun 09, 2018 at 11:17:05AM +0200, Michel Desmoulin wrote:
> Such as that:
> 
>     def starting_when(element):
>         ...
> 
>     a_list[starting_when:]

> Is equivalent to:
[...]
>     list(dropwhile(lambda x: not starting_when(x), a_list))
> 

That looks like a slice from an index to the end of the list. Things 
which are similar should look similar, but things which are different 
should NOT look similar.

What would:

    alist[callable:callable:callable]

do? How about this one?

    alist[7:callable:-1]


If there are not meaningful interpretations of callables as part of 
general slice notation, then we shouldn't use slice notation as a 
shortcut for dropwhile.

Rather than give this syntactic support, I'd rather add a new function 
to itertools that composes takewhile and dropwhile:


def between(iterable, startcondition, endcondition):
    it = iter(iterable)
    return takewhile(lambda x: not endcondition(x), 
           dropwhile(lambda x: not startcondition(x), it)
           )

If the caller wants to convert to a list (or some other sequence), they 
can, otherwise they can keep it as an iterator.


-- 
Steve


More information about the Python-ideas mailing list