code: def ref(self, tickers, flds, ovrds=None):
          
          ovrds = [] if not ovrds else ovrds
  
          logger = _get_logger(self.debug)
          if type(tickers) is not list:
              tickers = [tickers]
          if type(flds) is not list:
              flds = [flds]
          request = self._create_req('ReferenceDataRequest', tickers, flds,
                                     ovrds, [])
          logger.info('Sending Request:\n{}'.format(request))
          self._session.sendRequest(request, identity=self._identity)
          data = self._parse_ref(flds)
          data = pd.DataFrame(data)
          data.columns = ['ticker', 'field', 'value']
          return data
docs: Make a reference data request, get tickers and fields, return long
          pandas DataFrame with columns [ticker, field, value]
  
          Parameters
          ----------
          tickers: {list, string}
              String or list of strings corresponding to tickers
          flds: {list, string}
              String or list of strings corresponding to FLDS
          ovrds: list of tuples
              List of tuples where each tuple corresponds to the override
              field and value
  
          Example
          -------
          >>> import pdblp
          >>> con = pdblp.BCon()
          >>> con.start()
          >>> con.ref("CL1 Comdty", ["FUT_GEN_MONTH"])
  
          Notes
          -----
          This returns reference data which has singleton values. In raw format
          the messages passed back contain data of the form
  
          fieldData = {
                  FUT_GEN_MONTH = "FGHJKMNQUVXZ"
          }