code: def unzip(seq, elem_len=None):
      """Unzip a length n sequence of length m sequences into m seperate length
      n sequences.
      Parameters
      ----------
      seq : iterable[iterable]
          The sequence to unzip.
      elem_len : int, optional
          The expected length of each element of ``seq``. If not provided this
          will be infered from the length of the first element of ``seq``. This
          can be used to ensure that code like: ``a, b = unzip(seq)`` does not
          fail even when ``seq`` is empty.
      Returns
      -------
      seqs : iterable[iterable]
          The new sequences pulled out of the first iterable.
      Raises
      ------
      ValueError
          Raised when ``seq`` is empty and ``elem_len`` is not provided.
          Raised when elements of ``seq`` do not match the given ``elem_len`` or
          the length of the first element of ``seq``.
      Examples
      --------
      >>> seq = [('a', 1), ('b', 2), ('c', 3)]
      >>> cs, ns = unzip(seq)
      >>> cs
      ('a', 'b', 'c')
      >>> ns
      (1, 2, 3)
  
      # checks that the elements are the same length
      >>> seq = [('a', 1), ('b', 2), ('c', 3, 'extra')]
      >>> cs, ns = unzip(seq)
      Traceback (most recent call last):
         ...
      ValueError: element at index 2 was length 3, expected 2
  
      # allows an explicit element length instead of infering
      >>> seq = [('a', 1, 'extra'), ('b', 2), ('c', 3)]
      >>> cs, ns = unzip(seq, 2)
      Traceback (most recent call last):
        ...
      ValueError: element at index 0 was length 3, expected 2
  
      # handles empty sequences when a length is given
      >>> cs, ns = unzip([], elem_len=2)
      >>> cs == ns == ()
      True
  
      Notes
      -----
      This function will force ``seq`` to completion.
      """
      ret = tuple(zip(*_gen_unzip(map(tuple, seq), elem_len)))
      if ret:
          return ret
  
      if elem_len is None:
          raise ValueError(
              "cannot unzip empty sequence without 'elem_len'"
          )
      return ((),) * elem_len
  
file_path: zipline/zipline/utils/functional.py
imports: from functools import reduce
  from operator import itemgetter
  from pprint import pformat
  from six import viewkeys, iteritems
  from six.moves import map, zip
  from toolz import curry, flip
  from .sentinel import sentinel
label_desc: Use image node_id 7 for calling a global function with example usage: unzip(seq, elem_len) and returns: unknown, ret