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