code: def test_multioutput_description(es):
      n_most_common = NMostCommon(2)
      n_most_common_feature = AggregationFeature(
          IdentityFeature(es["log"].ww["zipcode"]),
          "sessions",
          n_most_common,
      )
      first_most_common_slice = n_most_common_feature[0]
      second_most_common_slice = n_most_common_feature[1]
  
      n_most_common_base = 'The 2 most common values of the "zipcode" of all instances of "log" for each "id" in "sessions".'
      n_most_common_first = (
          'The most common value of the "zipcode" of all instances of "log" '
          'for each "id" in "sessions".'
      )
      n_most_common_second = (
          'The 2nd most common value of the "zipcode" of all instances of '
          '"log" for each "id" in "sessions".'
      )
  
      assert (
          describe_feature(n_most_common_feature) == n_most_common_base
      )
      assert (
          describe_feature(first_most_common_slice)
          == n_most_common_first
      )
      assert (
          describe_feature(second_most_common_slice)
          == n_most_common_second
      )
  
      class CustomMultiOutput(TransformPrimitive):
          name = "custom_multioutput"
          input_types = [ColumnSchema(semantic_tags={"category"})]
          return_type = ColumnSchema(semantic_tags={"category"})
  
          number_output_features = 4
  
      custom_feat = TransformFeature(
          IdentityFeature(es["log"].ww["zipcode"]),
          CustomMultiOutput,
      )
  
      generic_base = (
          'The result of applying CUSTOM_MULTIOUTPUT to the "zipcode".'
      )
      generic_first = 'The 1st output from applying CUSTOM_MULTIOUTPUT to the "zipcode".'
      generic_second = 'The 2nd output from applying CUSTOM_MULTIOUTPUT to the "zipcode".'
  
      assert describe_feature(custom_feat) == generic_base
      assert describe_feature(custom_feat[0]) == generic_first
      assert describe_feature(custom_feat[1]) == generic_second
  
      CustomMultiOutput.description_template = [
          "the multioutput of {}",
          "the {nth_slice} multioutput part of {}",
      ]
      template_base = 'The multioutput of the "zipcode".'
      template_first_slice = (
          'The 1st multioutput part of the "zipcode".'
      )
      template_second_slice = (
          'The 2nd multioutput part of the "zipcode".'
      )
      template_third_slice = (
          'The 3rd multioutput part of the "zipcode".'
      )
      template_fourth_slice = (
          'The 4th multioutput part of the "zipcode".'
      )
      assert describe_feature(custom_feat) == template_base
      assert describe_feature(custom_feat[0]) == template_first_slice
      assert describe_feature(custom_feat[1]) == template_second_slice
      assert describe_feature(custom_feat[2]) == template_third_slice
      assert describe_feature(custom_feat[3]) == template_fourth_slice
  
      CustomMultiOutput.description_template = [
          "the multioutput of {}",
          "the primary multioutput part of {}",
          "the secondary multioutput part of {}",
      ]
      custom_base = 'The multioutput of the "zipcode".'
      custom_first_slice = (
          'The primary multioutput part of the "zipcode".'
      )
      custom_second_slice = (
          'The secondary multioutput part of the "zipcode".'
      )
      bad_slice_error = "Slice out of range of template"
      assert describe_feature(custom_feat) == custom_base
      assert describe_feature(custom_feat[0]) == custom_first_slice
      assert describe_feature(custom_feat[1]) == custom_second_slice
      with pytest.raises(IndexError, match=bad_slice_error):
          describe_feature(custom_feat[2])
  
file_path: featuretools/featuretools/tests/primitive_tests/test_feature_descriptions.py
imports: import json
  import os
  import pytest
  from woodwork.column_schema import ColumnSchema
  from featuretools import describe_feature
  from featuretools.feature_base import AggregationFeature, DirectFeature, GroupByTransformFeature, IdentityFeature, TransformFeature
  from featuretools.primitives import Absolute, AggregationPrimitive, CumMean, EqualScalar, Mean, Mode, NMostCommon, NumUnique, PercentTrue, Sum, TransformPrimitive
label_desc: Use image node_id 8 for calling a global function with example usage: test_multioutput_description(es) without return types