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) )