code: def candidate(self, cand_func, args=None, kwargs=None, name='Candidate', context=None):
          '''
          Adds a candidate function to an experiment. Can be used multiple times for
          multiple candidates.
  
          :param callable cand_func: your control function
          :param iterable args: positional arguments to pass to your function
          :param dict kwargs: keyword arguments to pass to your function
          :param string name: a name for your observation
          :param dict context: observation-specific context
          '''
          self._candidates.append({
              'func': cand_func,
              'args': args or [],
              'kwargs': kwargs or {},
              'name': name,
              'context': context or {},
          }f candidate(self, cand_func, args=None, kwargs=None, name='Candidate', context=None):
          '''
          Adds a candidate function to an experiment. Can be used multiple times for
          multiple candidates.
  
          :param callable cand_func: your control function
          :param iterable args: positional arguments to pass to your function
          :param dict kwargs: keyword arguments to pass to your function
          :param string name: a name for your observation
          :param dict context: observation-specific context
          '''
          self._candidates.append({
              'func': cand_func,
              'args': args or [],
              'kwargs': kwargs or {},
              'name': name,
              'context': context or {},
          })
docs: Adds a candidate function to an experiment. Can be used multiple times for
          multiple candidates.
  
          :param callable cand_func: your control function
          :param iterable args: positional arguments to pass to your function
          :param dict kwargs: keyword arguments to pass to your function
          :param string name: a name for your observation
          :param dict context: observation-specific context