docs: def _get_features(self, eopatch=None):
          """A generator of parsed features.
  
          :param eopatch: A given EOPatch
          :type eopatch: EOPatch or None
          :return: One by one feature
          :rtype: tuple(FeatureType, str) or tuple(FeatureType, str, str)
          """
          for feature_type, feature_dict in self.feature_collection.items():
              if feature_type is None and self.default_feature_type is not None:
                  feature_type = self.default_feature_type
  
              if feature_type is None:
                  for feature_name, new_feature_name in feature_dict.items():
                      if eopatch is None:
                          yield self._return_feature(..., feature_name, new_feature_name)
                      else:
                          found_feature_type = self._find_feature_type(feature_name, eopatch)
                          if found_feature_type:
                              yield self._return_feature(found_feature_type, feature_name, new_feature_name)
                          else:
                              raise ValueError("Feature with name '{}' does not exist among features of allowed feature"
                                               " types in given EOPatch. Allowed feature types are "
                                               "{}".format(feature_name, self.allowed_feature_types))
              elif feature_dict is ...:
                  if not feature_type.has_dict() or eopatch is None:
                      yield self._return_feature(feature_type, ...)
                  else:
                      for feature_name in eopatch[feature_type]:
                          yield self._return_feature(feature_type, feature_name)
              else:
                  for feature_name, new_feature_name in feature_dict.items():
                      if eopatch is not None and feature_name not in eopatch[feature_type]:
                          raise ValueError('Feature {} of type {} was not found in EOPatch'.format(feature_name,
                                                                                                   feature_type))
                      yield self._return_feature(feature_type, feature_name, new_feature_name)