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)
    xp = cuda.get_array_module(hx, hx.data)
    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:
            rnn = NStepBiGRU(n_layers, states)
        else:
            rnn = NStepGRU(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 = [concat.concat([w[0], w[1], w[2]], axis=0) for w in ws]
        hws = [concat.concat([w[3], w[4], w[5]], axis=0) for w in ws]
        xbs = [concat.concat([b[0], b[1], b[2]], axis=0) for b in bs]
        hbs = [concat.concat([b[3], b[4], b[5]], axis=0) 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]
                h_list = []
                for x in xs_list:
                    batch = x.shape[0]
                    if (h.shape[0] > batch):
                        (h, h_rest) = split_axis.split_axis(h, [batch], axis=0)
                    else:
                        h_rest = None
                    if (layer > 0):
                        x = dropout.dropout(x, ratio=dropout_ratio)
                    gru_x = linear.linear(x,...

What's a good function header?

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

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