mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			38 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # from more_itertools 9.0
 | |
| def only(iterable, default=None, too_long=None):
 | |
|     """If *iterable* has only one item, return it.
 | |
|     If it has zero items, return *default*.
 | |
|     If it has more than one item, raise the exception given by *too_long*,
 | |
|     which is ``ValueError`` by default.
 | |
|     >>> only([], default='missing')
 | |
|     'missing'
 | |
|     >>> only([1])
 | |
|     1
 | |
|     >>> only([1, 2])  # doctest: +IGNORE_EXCEPTION_DETAIL
 | |
|     Traceback (most recent call last):
 | |
|     ...
 | |
|     ValueError: Expected exactly one item in iterable, but got 1, 2,
 | |
|      and perhaps more.'
 | |
|     >>> only([1, 2], too_long=TypeError)  # doctest: +IGNORE_EXCEPTION_DETAIL
 | |
|     Traceback (most recent call last):
 | |
|     ...
 | |
|     TypeError
 | |
|     Note that :func:`only` attempts to advance *iterable* twice to ensure there
 | |
|     is only one item.  See :func:`spy` or :func:`peekable` to check
 | |
|     iterable contents less destructively.
 | |
|     """
 | |
|     it = iter(iterable)
 | |
|     first_value = next(it, default)
 | |
| 
 | |
|     try:
 | |
|         second_value = next(it)
 | |
|     except StopIteration:
 | |
|         pass
 | |
|     else:
 | |
|         msg = (
 | |
|             'Expected exactly one item in iterable, but got {!r}, {!r}, '
 | |
|             'and perhaps more.'.format(first_value, second_value)
 | |
|         )
 | |
|         raise too_long or ValueError(msg)
 | |
| 
 | |
|     return first_value
 | 
