On Tue, Dec 3, 2019, at 20:46, Oscar Benjamin wrote:
> What exactly is the idiom here?
>
> Using bare next is not a good idea because it leaks StopIteration
> which can have awkward side effects. So are you suggesting something
> like
>
> result = next(re.finditer(...), None)
> if result is None:
> # raise or something
> else:
> # use result
>
> I would be in favour of adding an alternative to next that raises a
> different exception when the result isn't found.
result, *_ = re.finditer() raises ValueError.
Perhaps a way to prevent the values from being consumed and a list constructed
would be useful - maybe add a "result, * =" syntax?
C# has First, Single, FirstOrDefault, and SingleOrDefault methods [the
OrDefault versions return null/zero instead of raising an exception, and single
raises if there are multiple items]
These can be envisioned roughly as
def first(it):
x, *_ = it
return x
def first_or_default(it):
x, *_ = [*it] or [None]
return x
def single(it):
x, = it
return x
def single_or_default(it):
x, = [*it] or [None]
return x
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/ZMNBNOIBV6YA3H6TA2V4TQC3TJ65XTDQ/
Code of Conduct: http://python.org/psf/codeofconduct/