code: def _merge_features_(
      features: List[Dict[str, Any]],
      defaults: Dict[str, Any],
      exclude_keys: Set[str],
  ):
      for feature in features:
          ftype = feature.get(TYPE)
          if not ftype:
              continue
  
          default_feature = defaults.get(ftype, {})
          merged_feature = _merge_dict_with_types(
              default_feature, feature, exclude_keys
          )
  
          # In-place replacement of the old feature with the new
          feature.clear()
          feature.update(merged_feature)
  
imports: import copy
  import logging
  import sys
  import warnings
  from typing import Any, Dict, List, Mapping, Set, TYPE_CHECKING
  from marshmallow import ValidationError
  from transformers import AutoConfig
  from ludwig.api_annotations import DeveloperAPI
  from ludwig.constants import CATEGORY, COMBINED, DECODER, DEFAULTS, ENCODER, GRID_SEARCH, INPUT_FEATURES, LOSS, MODEL_ECD, MODEL_LLM, OUTPUT_FEATURES, PARAMETERS, PREPROCESSING, SEQUENCE, SPACE, TEXT, TYPE
  from ludwig.features.feature_utils import compute_feature_hash
  from ludwig.schema.features.utils import output_config_registry
  from ludwig.schema.hyperopt.scheduler import BaseHyperbandSchedulerConfig
  from ludwig.schema.llms.generation import LLMGenerationConfig
  from ludwig.schema.trainer import ECDTrainerConfig
  from ludwig.types import HyperoptConfigDict, ModelConfigDict
  from ludwig.utils.data_utils import get_sanitized_feature_name
  from ludwig.utils.llm_utils import get_context_len
label_desc: Use image node_id 2 for calling a global function with example usage: _merge_features_(features, defaults, exclude_keys) without return types