py39compat.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import functools
  2. import itertools
  3. import platform
  4. import sys
  5. def add_ext_suffix_39(vars):
  6. """
  7. Ensure vars contains 'EXT_SUFFIX'. pypa/distutils#130
  8. """
  9. import _imp
  10. ext_suffix = _imp.extension_suffixes()[0]
  11. vars.update(
  12. EXT_SUFFIX=ext_suffix,
  13. # sysconfig sets SO to match EXT_SUFFIX, so maintain
  14. # that expectation.
  15. # https://github.com/python/cpython/blob/785cc6770588de087d09e89a69110af2542be208/Lib/sysconfig.py#L671-L673
  16. SO=ext_suffix,
  17. )
  18. needs_ext_suffix = sys.version_info < (3, 10) and platform.system() == 'Windows'
  19. add_ext_suffix = add_ext_suffix_39 if needs_ext_suffix else lambda vars: None
  20. # from more_itertools
  21. class UnequalIterablesError(ValueError):
  22. def __init__(self, details=None):
  23. msg = 'Iterables have different lengths'
  24. if details is not None:
  25. msg += (': index 0 has length {}; index {} has length {}').format(*details)
  26. super().__init__(msg)
  27. # from more_itertools
  28. def _zip_equal_generator(iterables):
  29. _marker = object()
  30. for combo in itertools.zip_longest(*iterables, fillvalue=_marker):
  31. for val in combo:
  32. if val is _marker:
  33. raise UnequalIterablesError()
  34. yield combo
  35. # from more_itertools
  36. def _zip_equal(*iterables):
  37. # Check whether the iterables are all the same size.
  38. try:
  39. first_size = len(iterables[0])
  40. for i, it in enumerate(iterables[1:], 1):
  41. size = len(it)
  42. if size != first_size:
  43. raise UnequalIterablesError(details=(first_size, i, size))
  44. # All sizes are equal, we can use the built-in zip.
  45. return zip(*iterables)
  46. # If any one of the iterables didn't have a length, start reading
  47. # them until one runs out.
  48. except TypeError:
  49. return _zip_equal_generator(iterables)
  50. zip_strict = (
  51. _zip_equal if sys.version_info < (3, 10) else functools.partial(zip, strict=True)
  52. )