docs: def basic_retinotopy_data(hemi, retino_type):
      '''
      basic_retinotopy_data(hemi, t) yields a numpy array of data for the given cortex object hemi
      and retinotopy type t; it does this by looking at the properties in hemi and picking out any
      combination that is commonly used to denote empirical retinotopy data. These common names are
      stored in _predicted_retintopy_names, in order of preference, which may be modified.
      The argument t should be one of 'polar_angle', 'eccentricity', 'visual_area', or 'weight'.
      Unlike the related functions empirical_retinotopy_data and predicted_retinotopy_data, this
      function calls both of these (predicted first then empirical) in the case that it does not
      find a valid property.
      '''
      dat = _retinotopy_names[retino_type.lower()]
      val = next((hemi.prop(s) for s in six.iterkeys(hemi.properties) if s.lower() in dat), None)
      if val is None and retino_type.lower() != 'weight':
          val = predicted_retinotopy_data(hemi, retino_type)
      if val is None and retino_type.lower() != 'visual_area':
          val = empirical_retinotopy_data(hemi, retino_type)
      return val