docs: def check_fill_value_outside_valid_range(self, ds):
          '''
          Checks each variable's _FillValue to ensure that it's in valid_range or
          between valid_min and valid_max according to CF §2.5.1
  
          CF §2.5.1 The _FillValue should be outside the range specified by
          valid_range (if used) for a variable.
  
          :param netCDF4.Dataset ds: An open netCDF dataset
          :rtype: list
          :return: List of Results
          '''
          valid_fill_range = TestCtx(BaseCheck.MEDIUM, self.section_titles['2.5'] )
  
          for name, variable in ds.variables.items():
              # If the variable doesn't have a defined _FillValue don't check it.
  
              if not hasattr(variable, '_FillValue'):
                  continue
  
              fill_value = variable._FillValue
  
              attrs = variable.ncattrs()
  
              if 'valid_range' in attrs:
                  if isinstance(variable.valid_range, basestring):
                      m = '§2.5.1 Fill Values should be outside the range specified by valid_range' # subsection message
                      valid_fill_range.assert_true(False, '{};\n\t{}:valid_range must be a numeric type not a string'.format(m, name))
                      continue
                  rmin, rmax = variable.valid_range
                  spec_by = 'valid_range'
  
              elif 'valid_min' in attrs and 'valid_max' in attrs:
                  if isinstance(variable.valid_min, basestring):
                      valid_fill_range.assert_true(False, '{}:valid_min must be a numeric type not a string'.format(name))
                  if isinstance(variable.valid_max, basestring):
                      valid_fill_range.assert_true(False, '{}:valid_max must be a numeric type not a string'.format(name))
                  if isinstance(variable.valid_min, basestring) or \
                     isinstance(variable.valid_max, basestring):
                      continue
                  rmin = variable.valid_min
                  rmax = variable.valid_max
                  spec_by = 'valid_min/valid_max'
              else:
                  continue
  
              if np.isnan(fill_value):
                  valid = True
              else:
                  valid = (fill_value < rmin or fill_value > rmax)
  
              valid_fill_range.assert_true(valid,
                                           "{}:_FillValue ({}) should be outside the range specified by {} ({}, {})"
                                           "".format(name, fill_value, spec_by, rmin, rmax))
  
          return valid_fill_range.to_result()