code: def read(self, nml_fname, nml_patch_in=None, patch_fname=None):
          
          # For switching based on files versus paths
          nml_is_path = not hasattr(nml_fname, 'read')
          patch_is_path = not hasattr(patch_fname, 'read')
  
          # Convert patch data to a Namelist object
          if nml_patch_in is not None:
              if not isinstance(nml_patch_in, dict):
                  raise TypeError('Input patch must be a dict or a Namelist.')
  
              nml_patch = copy.deepcopy(Namelist(nml_patch_in))
  
              if not patch_fname and nml_is_path:
                  patch_fname = nml_fname + '~'
              elif not patch_fname:
                  raise ValueError('f90nml: error: No output file for patch.')
              elif nml_fname == patch_fname:
                  raise ValueError('f90nml: error: Patch filepath cannot be the '
                                   'same as the original filepath.')
              if patch_is_path:
                  self.pfile = open(patch_fname, 'w')
              else:
                  self.pfile = patch_fname
          else:
              nml_patch = Namelist()
  
          try:
              nml_file = open(nml_fname, 'r') if nml_is_path else nml_fname
              try:
                  return self._readstream(nml_file, nml_patch)
  
              # Close the files we opened on any exceptions within readstream
              finally:
                  if nml_is_path:
                      nml_file.close()
          finally:
              if self.pfile and patch_is_path:
                  self.pfile.close()
docs: Parse a Fortran namelist file and store the contents.
  
          >>> parser = f90nml.Parser()
          >>> data_nml = parser.read('data.nml')