You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
import functools
 | 
						|
import itertools
 | 
						|
import platform
 | 
						|
import sys
 | 
						|
 | 
						|
 | 
						|
def add_ext_suffix_39(vars):
 | 
						|
    """
 | 
						|
    Ensure vars contains 'EXT_SUFFIX'. pypa/distutils#130
 | 
						|
    """
 | 
						|
    import _imp
 | 
						|
 | 
						|
    ext_suffix = _imp.extension_suffixes()[0]
 | 
						|
    vars.update(
 | 
						|
        EXT_SUFFIX=ext_suffix,
 | 
						|
        # sysconfig sets SO to match EXT_SUFFIX, so maintain
 | 
						|
        # that expectation.
 | 
						|
        # https://github.com/python/cpython/blob/785cc6770588de087d09e89a69110af2542be208/Lib/sysconfig.py#L671-L673
 | 
						|
        SO=ext_suffix,
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
needs_ext_suffix = sys.version_info < (3, 10) and platform.system() == 'Windows'
 | 
						|
add_ext_suffix = add_ext_suffix_39 if needs_ext_suffix else lambda vars: None
 | 
						|
 | 
						|
 | 
						|
# from more_itertools
 | 
						|
class UnequalIterablesError(ValueError):
 | 
						|
    def __init__(self, details=None):
 | 
						|
        msg = 'Iterables have different lengths'
 | 
						|
        if details is not None:
 | 
						|
            msg += (': index 0 has length {}; index {} has length {}').format(*details)
 | 
						|
 | 
						|
        super().__init__(msg)
 | 
						|
 | 
						|
 | 
						|
# from more_itertools
 | 
						|
def _zip_equal_generator(iterables):
 | 
						|
    _marker = object()
 | 
						|
    for combo in itertools.zip_longest(*iterables, fillvalue=_marker):
 | 
						|
        for val in combo:
 | 
						|
            if val is _marker:
 | 
						|
                raise UnequalIterablesError()
 | 
						|
        yield combo
 | 
						|
 | 
						|
 | 
						|
# from more_itertools
 | 
						|
def _zip_equal(*iterables):
 | 
						|
    # Check whether the iterables are all the same size.
 | 
						|
    try:
 | 
						|
        first_size = len(iterables[0])
 | 
						|
        for i, it in enumerate(iterables[1:], 1):
 | 
						|
            size = len(it)
 | 
						|
            if size != first_size:
 | 
						|
                raise UnequalIterablesError(details=(first_size, i, size))
 | 
						|
        # All sizes are equal, we can use the built-in zip.
 | 
						|
        return zip(*iterables)
 | 
						|
    # If any one of the iterables didn't have a length, start reading
 | 
						|
    # them until one runs out.
 | 
						|
    except TypeError:
 | 
						|
        return _zip_equal_generator(iterables)
 | 
						|
 | 
						|
 | 
						|
zip_strict = (
 | 
						|
    _zip_equal if sys.version_info < (3, 10) else functools.partial(zip, strict=True)
 | 
						|
)
 |