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