human
I wrote the below code

    argument.check_unexpected_kwargs(kwargs, train='train    argument    is    not    supported    anymore.    Use    chainer.using_config', use_cudnn='use_cudnn    argument    is    not    supported    anymore.    Use    chainer.using_config')
    argument.assert_kwargs_empty(kwargs)
    activation_list = ['tanh', 'relu']
    if (activation not in activation_list):
        candidate = ','.join(activation_list)
        raise ValueError(('Invalid    activation:    "%s".    Please    select    from    [%s]' % (activation, candidate)))
    xp = cuda.get_array_module(hx)
    if ((xp is not numpy) and chainer.should_use_cudnn('>=auto', 5000)):
        states = get_random_state().create_dropout_states(dropout_ratio)
        inputs = tuple(itertools.chain((hx,), itertools.chain.from_iterable(ws), itertools.chain.from_iterable(bs), xs))
        if use_bi_direction:
            if (activation == 'tanh'):
                rnn = NStepBiRNNTanh(n_layers, states)
            elif (activation == 'relu'):
                rnn = NStepBiRNNReLU(n_layers, states)
        elif (activation == 'tanh'):
            rnn = NStepRNNTanh(n_layers, states)
        elif (activation == 'relu'):
            rnn = NStepRNNReLU(n_layers, states)
        ret = rnn(*inputs)
        (hy,) = ret[:1]
        ys = ret[1:]
        return (hy, ys)
    else:
        direction = (2 if use_bi_direction else 1)
        hx = split_axis.split_axis(hx, (n_layers * direction), axis=0, force_tuple=True)
        hx = [reshape.reshape(h, h.shape[1:]) for h in hx]
        xws = [_stack_weight([w[0]]) for w in ws]
        hws = [_stack_weight([w[1]]) for w in ws]
        xbs = [_stack_weight([b[0]]) for b in bs]
        hbs = [_stack_weight([b[1]]) for b in bs]
        xs_next = xs
        hy = []
        for layer in six.moves.range(n_layers):
            def _one_directional_loop(di):
                xs_list = (xs_next if (di == 0) else reversed(xs_next))
                layer_idx = ((direction * layer) + di)
                h = hx[layer_idx]
               ...

What's a good function header?

=====
Here's a good function header?
assistant
#Here's a good function header.

def n_step_rnn_base(n_layers, dropout_ratio, hx, ws, bs, xs, activation, use_bi_direction, **kwargs):