forked from mrlan/EnglishPal
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)
|
|
)
|