docs: def _parse_features(features, new_names):
          """Takes a collection of features structured in a various ways and parses them into one way.
  
          If input format is not recognized it raises an error.
  
          :return: A collection of features
          :rtype: collections.OrderedDict(FeatureType: collections.OrderedDict(str: str or Ellipsis) or Ellipsis)
          :raises: ValueError
          """
          if isinstance(features, dict):
              return FeatureParser._parse_dict(features, new_names)
  
          if isinstance(features, list):
              return FeatureParser._parse_list(features, new_names)
  
          if isinstance(features, tuple):
              return FeatureParser._parse_tuple(features, new_names)
  
          if features is ...:
              return OrderedDict([(feature_type, ...) for feature_type in FeatureType])
  
          if isinstance(features, FeatureType):
              return OrderedDict([(features, ...)])
  
          if isinstance(features, str):
              return OrderedDict([(None, OrderedDict([(features, ...)]))])
  
          raise ValueError('Unknown format of input features: {}'.format(features))