1# from more_itertools 9.0
2def 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 1
11 >>> only([1, 2]) # doctest: +IGNORE_EXCEPTION_DETAIL
12 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_DETAIL
17 Traceback (most recent call last):
18 ...
19 TypeError
20 Note that :func:`only` attempts to advance *iterable* twice to ensure there
21 is only one item. See :func:`spy` or :func:`peekable` to check
22 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 pass
31 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_value