Something like this? It avoids using globals, which is generally a good thing.
import whatever
import functools
def prefix_function(function, prefunction):
@functools.wraps(function)
def run(*args, **kwargs):
prefunction(*args, **kwargs)
return function(*args, **kwargs)
return run
def this_is_a_function(parameter):
pass # Your own code here that will be run before
whatever.this_is_a_function = prefix_function(
whatever.this_is_a_function, this_is_a_function)
prefix_function
is a function that takes two functions: function
and prefunction
. It returns a function that takes any parameters, and calls prefunction
followed by function
with the same parameters. The prefix_function
function works for any callable, so you only need to program the prefixing code once for any other hooking you might need to do.
@functools.wraps
makes it so that the docstring and name of the returned wrapper function is the same.
If you need this_is_a_function
to call the old whatever.this_is_a_function
with arguments different than what was passed to it, you could do something like this:
import whatever
import functools
def wrap_function(oldfunction, newfunction):
@functools.wraps(function)
def run(*args, **kwargs):
return newfunction(oldfunction, *args, **kwargs)
return run
def this_is_a_function(oldfunc, parameter):
# Do some processing or something to customize the parameters to pass
newparams = parameter * 2 # Example of a change to newparams
return oldfunc(newparams)
whatever.this_is_a_function = wrap_function(
whatever.this_is_a_function, this_is_a_function)
There is a problem that if whatever
is a pure C module, it's typically impossible (or very difficult) to change its internals in the first place.