docs: def broadcast_zip(list1, list2):
      r"""
      Zips elementwise pairs between list1 and list2. Broadcasts
      the first dimension if a single list is of length 1.
  
      Aliased as bzip
  
      Args:
          list1 (list):
          list2 (list):
  
      Returns:
          list: list of pairs
  
      SeeAlso:
          util_dict.dzip
  
      Raises:
          ValueError: if the list dimensions are not broadcastable
  
      Example:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_list import *  # NOQA
          >>> import utool as ut
          >>> assert list(bzip([1, 2, 3], [4])) == [(1, 4), (2, 4), (3, 4)]
          >>> assert list(bzip([1, 2, 3], [4, 4, 4])) == [(1, 4), (2, 4), (3, 4)]
          >>> assert list(bzip([1], [4, 4, 4])) == [(1, 4), (1, 4), (1, 4)]
          >>> ut.assert_raises(ValueError, bzip, [1, 2, 3], [])
          >>> ut.assert_raises(ValueError, bzip, [], [4, 5, 6])
          >>> ut.assert_raises(ValueError, bzip, [], [4])
          >>> ut.assert_raises(ValueError, bzip, [1, 2], [4, 5, 6])
          >>> ut.assert_raises(ValueError, bzip, [1, 2, 3], [4, 5])
      """
      try:
          len(list1)
      except TypeError:
          list1 = list(list1)
      try:
          len(list2)
      except TypeError:
          list2 = list(list2)
      # if len(list1) == 0 or len(list2) == 0:
      #     # Corner case where either list is empty
      #     return []
      if len(list1) == 1 and len(list2) > 1:
          list1 = list1 * len(list2)
      elif len(list1) > 1 and len(list2) == 1:
          list2 = list2 * len(list1)
      elif len(list1) != len(list2):
          raise ValueError('out of alignment len(list1)=%r, len(list2)=%r' % (
              len(list1), len(list2)))
      # return list(zip(list1, list2))
      return zip(list1, list2)