code: def filename(self,filename=None,ext=None,set_default=False,use_my_ext=False):
          
          if filename is None:
              if not hasattr(self,'_filename'):
                  self._filename = None        # add attribute to class
              if self._filename:
                  filename = self._filename
              else:
                  raise ValueError("A file name is required because no default file name was defined.")
              my_ext = None
          else:
              filename, my_ext = os.path.splitext(filename)
              if set_default:                  # replaces existing default file name
                  self._filename = filename
          if my_ext and use_my_ext:
              ext = my_ext
          if ext is not None:
              if ext.startswith(os.extsep):
                  ext = ext[1:]  # strip a dot to avoid annoying mistakes
              if ext != "":
                  filename = filename + os.extsep + ext
          return filename
docs: Supply a file name for the class object.
  
          Typical uses::
  
             fn = filename()             ---> <default_filename>
             fn = filename('name.ext')   ---> 'name'
             fn = filename(ext='pickle') ---> <default_filename>'.pickle'
             fn = filename('name.inp','pdf') --> 'name.pdf'
             fn = filename('foo.pdf',ext='png',use_my_ext=True) --> 'foo.pdf'
  
          The returned filename is stripped of the extension
          (``use_my_ext=False``) and if provided, another extension is
          appended. Chooses a default if no filename is given.
  
          Raises a ``ValueError`` exception if no default file name is known.
  
          If ``set_default=True`` then the default filename is also set.
  
          ``use_my_ext=True`` lets the suffix of a provided filename take
          priority over a default ``ext`` tension.
  
          .. versionchanged:: 0.3.1
             An empty string as *ext* = "" will suppress appending an extension.