code: def product_get(self, ids=None, names=None,
                      include_fields=None, exclude_fields=None,
                      ptype=None):
          
          if ids is None and names is None and ptype is None:
              ptype = "accessible"
  
          if ptype:
              raw = None
              if ptype == "accessible":
                  raw = self._proxy.Product.get_accessible_products()
              elif ptype == "selectable":
                  raw = self._proxy.Product.get_selectable_products()
              elif ptype == "enterable":
                  raw = self._proxy.Product.get_enterable_products()
  
              if raw is None:
                  raise RuntimeError("Unknown ptype=%s" % ptype)
              ids = raw['ids']
              log.debug("For ptype=%s found ids=%s", ptype, ids)
  
          kwargs = {}
          if ids:
              kwargs["ids"] = self._listify(ids)
          if names:
              kwargs["names"] = self._listify(names)
          if include_fields:
              kwargs["include_fields"] = include_fields
          if exclude_fields:
              kwargs["exclude_fields"] = exclude_fields
  
          ret = self._proxy.Product.get(kwargs)
          return ret['products']
docs: Raw wrapper around Product.get
          https://bugzilla.readthedocs.io/en/latest/api/core/v1/product.html#get-product
  
          This does not perform any caching like other product API calls.
          If ids, names, or ptype is not specified, we default to
          ptype=accessible for historical reasons
  
          @ids: List of product IDs to lookup
          @names: List of product names to lookup
          @ptype: Either 'accessible', 'selectable', or 'enterable'. If
              specified, we return data for all those
          @include_fields: Only include these fields in the output
          @exclude_fields: Do not include these fields in the output