[Python-ideas] Function to return first(or last) true value from list

Oscar Benjamin oscar.j.benjamin at gmail.com
Fri Feb 21 17:05:19 CET 2014


On 21 February 2014 09:56, Peter Otten <__peter__ at web.de> wrote:
> אלעזר wrote:
>
>> What is the "classic" use case for next() raising StopIteration, to be
>> silently caught ? We need __next__ to do so in for loops, but when do we
>> need it in the functional form?
>
> Pretty much every generator that treats the first item(s) specially, like
> the one I gave above:

But there are also cases where that implicit behaviour is not desired.
I would rather have to explicitly return when that's what I want so
that the control flow is very clear.

For example when you use csv.DictReader and don't supply the
fieldnames argument you are saying that you want to read a csv file
with one header line containing column labels and zero or more data
lines. To me a fully empty file (with no header line) is invalid but
csv.DictReader will accept it as a csv file with zero rows. I would
prefer an error in this case since it would only happen in my usage if
an error had occurred somewhere else.

One of the examples you linked to shows exactly my own practice of
marking a next call with a comment:

    def __next__(self):
        while self.currkey == self.tgtkey:
            self.currvalue = next(self.it)    # Exit on StopIteration
            self.currkey = self.keyfunc(self.currvalue)
        self.tgtkey = self.currkey
        return (self.currkey, self._grouper(self.tgtkey))
    def _grouper(self, tgtkey):
        while self.currkey == tgtkey:
            yield self.currvalue
            self.currvalue = next(self.it)    # Exit on StopIteration
            self.currkey = self.keyfunc(self.currvalue)

IMO if you want that behaviour then you should mark it to show that
you thought about it and otherwise I'll treat any bare next with
suspicion.


Oscar


More information about the Python-ideas mailing list