On Sun, May 10, 2020 at 5:00 AM Christopher Barker <python...@gmail.com>
wrote:

> On Sat, May 9, 2020 at 1:58 PM Alex Hall <alex.moj...@gmail.com> wrote:
>
>>  I think this is a good idea. For sequences I'm not sure how big the
>> benefit is - I get that it's more efficient, but I rarely care that much,
>> because most lists are small. Why not extend the proposal to all iterators,
>> or at least common ones like generators?
>>
>
> Because the slice syntax, so far at least, only applies to Sequences. And
> in general, you can't use the full slice syntax on iterators anyway (they
> don't have a length).
>

Is that a major problem? Just use the syntax the way you would use
itertools.islice.

Incidentally, I imagine we could allow itertools.islice(iterable, 0, -n) by
iterating ahead by n items, keeping them in memory, and stopping when the
peeking ahead stops. I can understand though that this comes with some
caveats.


> and well, iterators are already iterators ... so there isn't an "extend
> the proposal" here at all.
>

I don't know what you're saying here.


> But without thinking about i much, I'm not sure adding slice syntax to
> iterators in general makes sense -- slicing is quite connected to indexing,
> which iterators don't support.
>

Again, it would make exactly as much sense as itertools.islice.


> > That would allow avoiding itertools when I have no other choice.
>
> reading the thread on adding "strict" to zipk I'd say "avoiding itertools"
> is not really a goal of most folks :-)
>

Most of the points you made in your PEP still apply. itertools.islice is
verbose and not particularly readable. I'm not suggesting doing this just
to make things a little more convenient.


> Perhaps this could come with some new syntax? My first thought was
>> `iterator(1:2)`, the idea being that changing the brackets would give it
>> lazy iterator feel the same way that changing the brackets on a list
>> comprehension turns it into a generator. But it probably looks too much
>> like a function call.
>>
>
> doesn't just look like one -- it would clash. Remember that "iterable" and
> "iterator" is a protocol -- anything can support it. That would make it
> impossible to have a callable be an iterator
>

`iterator(1:2)` isn't a function call, it isn't valid syntax. The colon
would distinguish an islice from a call. But again, while it's techincally
unambiguous, it can still be confusing, and you've proven that point.


> So maybe we can play with double brackets instead:
>>
>
> What would this new syntax do, regardless of what it was? I"m not sure I
> follow. My idea is about creating a view iterable on sequences, I'm not
> sure what view iterable on an iterable would be?
>

`iterator(1:2)` would compile to roughly `itertools.islice(iterator, 1,
2)`, which would handle the rest at runtime:

- Failing if `iterator` isn't actually an iterator.
- Failing if a negative index is used on something without a length.
- Handling negative indices for sequences (is there any reason we don't
have that now?)
- Possibly deferring to a dunder like `__islice__` if one is defined so
that some classes (e.g. lists) can return a clever view or something if
they want.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/77OORLTSODLT73BPP3QENHLYRS3BIPIJ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to