code: def _generate_filename(cls, writer_spec, name, job_id, num,
                           attempt=None, seg_index=None):
      
      naming_format = cls._TMP_FILE_NAMING_FORMAT
      if seg_index is None:
        naming_format = writer_spec.get(cls.NAMING_FORMAT_PARAM,
                                        cls._DEFAULT_NAMING_FORMAT)
  
      template = string.Template(naming_format)
      try:
        # Check that template doesn't use undefined mappings and is formatted well
        if seg_index is None:
          return template.substitute(name=name, id=job_id, num=num)
        else:
          return template.substitute(name=name, id=job_id, num=num,
                                     attempt=attempt,
                                     seg=seg_index)
      except ValueError, error:
        raise errors.BadWriterParamsError("Naming template is bad, %s" % (error))
      except KeyError, error:
        raise errors.BadWriterParamsError("Naming template '%s' has extra "
                                          "mappings, %s" % (naming_format, error))
docs: Generates a filename for a particular output.
  
      Args:
        writer_spec: specification dictionary for the output writer.
        name: name of the job.
        job_id: the ID number assigned to the job.
        num: shard number.
        attempt: the shard attempt number.
        seg_index: index of the seg. None means the final output.
  
      Returns:
        a string containing the filename.
  
      Raises:
        BadWriterParamsError: if the template contains any errors such as invalid
          syntax or contains unknown substitution placeholders.