[Python-ideas] Integrate some itertools into the Python syntax
Michel Desmoulin
desmoulinmichel at gmail.com
Wed Mar 23 06:04:03 EDT 2016
Le 23/03/2016 06:13, Nick Coghlan a écrit :
> On 22 March 2016 at 09:06, Michel Desmoulin <desmoulinmichel at gmail.com> wrote:
>> So my first proposal is to be able to do:
>>
>> def stop(element):
>> return element > 4
>> print(numbers[:stop])
>>
>> It's quite pythonic, easy to understand : the end of the slice is when
>> this condition is met. Any not the strange way takewhile work, which is
>> "carry on as long as this condition is met".
>>
>> We could also extend itertools.islice to accept such parameter.
>
> iter() already has a two-argument form to accept a callable+sentinel
> value, so it may not be unreasonable to offer an "until" callback to
> say when to stop iterating.
>
> That is:
>
> def stop(element):
> return element >4
> print(list(iter(numbers, until=stop)))
Do you propose to make a "since" param too ?
>
> Slicing arbitrary iterables may be amenable to a str.join style
> solution, by putting the functionality on slice objects, rather than
> on the iterables:
>
> slice(3, 7).iter(iterable)
Those solutions are already much more convenient than using itertools,
but it's going to look very strange:
def foo(p):
with open(p) as f:
def begin():
return x.startswith('#')
def end():
return x != "STOP"
yield from slice(0, 10).iter(iter(f, since=begin, until=en))
The last line is really not Pythonic.
Compared to:
def foo(p):
with open(p) as f:
def begin():
return x.startswith('#')
def end():
return x != "STOP"
yield from f[begin:end][:10]
But I beleive there is an idea here. Attaching things to slice is
cleaner than to iter():
def foo(p):
with open(p) as f:
def begin():
return x.startswith('#')
def end():
return x != "STOP"
yield from slice.wraps(f)[begin:end][:10]
>
> (Whether or not to make slice notation usable outside subscript
> operations could then be tackled as an independent question)
>
> For itertools.chain, it may make sense to simply promote it to the builtins.
Same problem as with new keywords : it can be a problem with people
using chain as a var name.
>
> I'm not the least bit sure about the wisdom of the first two ideas,
> but the last one seems straightforward enough, and I'd be comfortable
> with us putting "chain" on the same tier as existing builtin iteration
> related tools like enumerate and zip.
To be fair, I don't nearly use chain as much as zip or enumerate, so I'm
not going to push for something as drastic.
>
> Regards,
> Nick.
>
More information about the Python-ideas
mailing list