codekingpro/portable-devtools
114k
1# from more_itertools 9.02def only(iterable, default=None, too_long=None):3 """If *iterable* has only one item, return it.4 If it has zero items, return *default*.5 If it has more than one item, raise the exception given by *too_long*,6 which is ``ValueError`` by default.7 >>> only([], default='missing')8 'missing'9 >>> only([1])10 111 >>> only([1, 2]) # doctest: +IGNORE_EXCEPTION_DETAIL12 Traceback (most recent call last):13 ...14 ValueError: Expected exactly one item in iterable, but got 1, 2,15 and perhaps more.'16 >>> only([1, 2], too_long=TypeError) # doctest: +IGNORE_EXCEPTION_DETAIL17 Traceback (most recent call last):18 ...19 TypeError20 Note that :func:`only` attempts to advance *iterable* twice to ensure there21 is only one item. See :func:`spy` or :func:`peekable` to check22 iterable contents less destructively.23 """24 it = iter(iterable)25 first_value = next(it, default)26 27 try:28 second_value = next(it)29 except StopIteration:30 pass31 else:32 msg = (33 'Expected exactly one item in iterable, but got {!r}, {!r}, '34 'and perhaps more.'.format(first_value, second_value)35 )36 raise too_long or ValueError(msg)37 38 return first_value39 