code: def natsort_keygen(key=None, alg=ns.DEFAULT):
      try:
          ns.DEFAULT | alg
      except TypeError:
          msg = "natsort_keygen: 'alg' argument must be from the enum 'ns'"
          raise ValueError(msg + ", got {}".format(py23_str(alg)))
      if alg & ns.LOCALEALPHA and natsort.compat.locale.dumb_sort():
          alg |= NS_DUMB
      if alg & ns.NUMAFTER:
          if alg & ns.LOCALEALPHA:
              sep = natsort.compat.locale.null_string_locale_max
          else:
              sep = natsort.compat.locale.null_string_max
          pre_sep = natsort.compat.locale.null_string_max
      else:
          if alg & ns.LOCALEALPHA:
              sep = natsort.compat.locale.null_string_locale
          else:
              sep = natsort.compat.locale.null_string
          pre_sep = natsort.compat.locale.null_string
      regex = utils.regex_chooser(alg)
      input_transform = utils.input_string_transform_factory(alg)
      component_transform = utils.string_component_transform_factory(alg)
      final_transform = utils.final_data_transform_factory(alg, sep, pre_sep)
      string_func = utils.parse_string_factory(
          alg, sep, regex.split, input_transform, component_transform, final_transform
      )
      if alg & ns.PATH:
          string_func = utils.parse_path_factory(string_func)
      bytes_func = utils.parse_bytes_factory(alg)
      num_func = utils.parse_number_factory(alg, sep, pre_sep)
      return partial(
          utils.natsort_key,
          key=key,
          string_func=string_func,
          bytes_func=bytes_func,
          num_func=num_func,
      )