human
I wrote the below code

    a = func.ap
    b = func.bq
    n = len(func.an)
    m = len(func.bm)
    p = len(a)
    z = func.args[2]
    x = z.atoms(Symbol).pop()
    (R, Dx) = DifferentialOperators(domain.old_poly_ring(x), 'Dx')
    mnp = ((-1) ** ((m + n) - p))
    r1 = (x * mnp)
    for i in range(len(a)):
        r1 *= (((x * Dx) + 1) - a[i])
    r2 = 1
    for i in range(len(b)):
        r2 *= ((x * Dx) - b[i])
    sol = (r1 - r2)
    if (not initcond):
        return HolonomicFunction(sol, x).composition(z)
    simp = hyperexpand(func)
    if (isinstance(simp, Infinity) or isinstance(simp, NegativeInfinity)):
        return HolonomicFunction(sol, x).composition(z)
    def _find_conditions(simp, x, x0, order, evalf=False):
        y0 = []
        for i in range(order):
            if evalf:
                val = simp.subs(x, x0).evalf()
            else:
                val = simp.subs(x, x0)
            if (((val.is_finite is not None) and (not val.is_finite)) or isinstance(val, NaN)):
                return None
            y0.append(val)
            simp = simp.diff(x)
        return y0
    if (not isinstance(simp, meijerg)):
        y0 = _find_conditions(simp, x, x0, sol.order)
        while (not y0):
            x0 += 1
            y0 = _find_conditions(simp, x, x0, sol.order)
        return HolonomicFunction(sol, x).composition(z, x0, y0)
    if isinstance(simp, meijerg):
        x0 = 1
        y0 = _find_conditions(simp, x, x0, sol.order, evalf)
        while (not y0):
            x0 += 1
            y0 = _find_conditions(simp, x, x0, sol.order, evalf)
        return HolonomicFunction(sol, x).composition(z, x0, y0)
    return HolonomicFunction(sol, x).composition(z)

What's a good function header?

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

def from_meijerg(func, x0=0, evalf=False, initcond=True, domain=QQ):