class_docstr: Composable cycles
  
  This class has compositions methods:
  
  ``+``
    for 'inner' products (zip)
  
  ``+=``
    in-place ``+``
  
  ``*``
    for outer products (`itertools.product`) and integer multiplication
  
  ``*=``
    in-place ``*``
  
  and supports basic slicing via ``[]``
  
  Parameters
  ----------
  left : Cycler or None
      The 'left' cycler
  
  right : Cycler or None
      The 'right' cycler
  
  op : func or None
      Function which composes the 'left' and 'right' cyclers.
class_docstr_tok: ["Composable","cycles","This","class","has","compositions","methods",":","``","+","``","for","'inner","'","products","(","zip",")","``","+=","``","in-place","``","+","``","``","*","``","for","outer","products","(","`","itertools.product","`",")","and","integer","multiplication","``","*","=","``","in-place","``","*","``","and","supports","basic","slicing","via","``","[","]","``","Parameters","--","--","--","--","--","left",":","Cycler","or","None","The","'left","'","cycler","right",":","Cycler","or","None","The","'right","'","cycler","op",":","func","or","None","Function","which","composes","the","'left","'","and","'right","'","cyclers","."]
docstr: Semi-private init
  
  Do not use this directly, use `cycler` function instead.
docstr_tok: ["Semi-private","init","Do","not","use","this","directly",",","use","`","cycler","`","function","instead","."]
code: def __init__(self, left, right=None, op=None):
      """Semi-private init
  
      Do not use this directly, use `cycler` function instead.
      """
      if isinstance(left, Cycler):
          self._left = Cycler(left._left, left._right, left._op)
      elif left is not None:
          # Need to copy the dictionary or else that will be a residual
          # mutable that could lead to strange errors
          self._left = [copy.copy(v) for v in left]
      else:
          self._left = None
  
      if isinstance(right, Cycler):
          self._right = Cycler(right._left, right._right, right._op)
      elif right is not None:
          # Need to copy the dictionary or else that will be a residual
          # mutable that could lead to strange errors
          self._right = [copy.copy(v) for v in right]
      else:
          self._right = None
  
      self._keys = _process_keys(self._left, self._right)
      self._op = op
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import six
  from itertools import product, cycle
  from six.moves import zip, reduce
  from operator import mul, add
  import copy
label_desc: Use image node_id 2 to create a new Cycler object from inherited base classes: object with example: obj = Cycler(left, right, op)