Bah, I figured it out. Turns out all I had to do was make sure the original function took *args and **kwargs, which is much easier to generalize (since I don't know how these functions will be)
So my function update() now has the signature
update(request, extra=None, *args, **kwargs)
And I can pass in "arbitrary" keywords by updating kwargs before I wrap it. Thanks for the clarification. The comments helped me narrow down what the issue was!
The only caveat is that I access status in the update function with
kwargs['status']
instead of just
status
Which isn't too bad