code: def test_override_multi_feature_names(pd_es):
      def gen_custom_names(
          primitive,
          base_feature_names,
          relationship_path_name,
          parent_dataframe_name,
          where_str,
          use_prev_str,
      ):
          base_string = "Custom_%s({}.{})".format(
              parent_dataframe_name,
              base_feature_names,
          )
          return [
              base_string % i
              for i in range(primitive.number_output_features)
          ]
  
      class NMostCommoner(AggregationPrimitive):
          name = "pd_top3"
          input_types = [ColumnSchema(semantic_tags={"numeric"})]
          return_type = ColumnSchema(semantic_tags={"category"})
          number_output_features = 3
  
          def generate_names(
              self,
              base_feature_names,
              relationship_path_name,
              parent_dataframe_name,
              where_str,
              use_prev_str,
          ):
              return gen_custom_names(
                  self,
                  base_feature_names,
                  relationship_path_name,
                  parent_dataframe_name,
                  where_str,
                  use_prev_str,
              )
  
      fm, features = dfs(
          entityset=pd_es,
          target_dataframe_name="products",
          instance_ids=[0, 1, 2],
          agg_primitives=[NMostCommoner],
          trans_primitives=[],
      )
  
      expected_names = []
      base_names = [["value"], ["value_2"], ["value_many_nans"]]
      for name in base_names:
          expected_names += gen_custom_names(
              NMostCommoner,
              name,
              None,
              "products",
              None,
              None,
          )
  
      for name in expected_names:
          assert name in fm.columns
  
imports: from datetime import datetime
  from inspect import isclass
  from math import isnan
  import numpy
  import pandas
  import pytest
  from woodwork.column_schema import ColumnSchema
  from woodwork.logical_types import Datetime
  from featuretools import AggregationFeature, Feature, IdentityFeature, Timedelta, calculate_feature_matrix, dfs, primitives
  from featuretools.entityset.relationship import RelationshipPath
  from featuretools.feature_base.cache import feature_cache
  from featuretools.primitives import Count, Max, Mean, Median, NMostCommon, NumTrue, NumUnique, Sum, TimeSinceFirst, TimeSinceLast, get_aggregation_primitives
  from featuretools.primitives.base import AggregationPrimitive
  from featuretools.synthesis.deep_feature_synthesis import DeepFeatureSynthesis, match
  from featuretools.tests.testing_utils import backward_path, feature_with_name, to_pandas
  from featuretools.utils.gen_utils import Library
label_desc: Use image node_id 27 for calling a global function with example usage: test_override_multi_feature_names(pd_es) and returns: unknown, gen_custom_names