human
I wrote the below code

    def _format(node):
        if isinstance(node, AST):
            fields = [(a, _format(b)) for (a, b) in iter_fields(node)]
            rv = ('%s(%s' % (node.__class__.__name__, ',    '.join(((('%s=%s' % field) for field in fields) if annotate_fields else (b for (a, b) in fields)))))
            if (include_attributes and node._attributes):
                rv += ((fields and ',    ') or '    ')
                rv += ',    '.join((('%s=%s' % (a, _format(getattr(node, a)))) for a in node._attributes))
            return (rv + ')')
        if isinstance(node, list):
            return ('[%s]' % ',    '.join((_format(x) for x in node)))
        return repr(node)
    if (not isinstance(node, AST)):
        raise TypeError(('expected    AST,    got    %r' % node.__class__.__name__))
    return _format(node)

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

def dump(node, annotate_fields=True, include_attributes=False):