I have some python code that defines a new function based on an old one. It looks like this
def myFunction(a: int, b: int, c: int):
# Do stuff
myNewFunction = lambda a, b: myFunction(a, b, 0)
My new function is the same as the old function, but sets the last argument to 0.
My question: Say I did not know the function took three arguments. Can I make the above solution more generic? An invalid solution with the right intention might be something like:
def myFunction(a: int, b: int, c: int):
# Do stuff
func_args = myFunction.__code__.co_varnames
func_args = func_args[:-1]
myNewFunction = lambda *func_args : myFunction(*func_args, 0)
CodePudding user response:
You're almost correct, you can use functools.partial
this way(instead of lambda):
from functools import partial
def myFunction(a: int, b: int, c: int):
print(a, b, c)
last_param_name = myFunction.__code__.co_varnames[-1]
new_func = partial(myFunction, **{last_param_name: 0})
new_func(10, 20)
Technically partial
is not a function it's a class but I don't think this is what you concern about.
A pure Python (roughly)equivalent of the original partial
exists in documentation if you want it to be a function type:
def partial(func, /, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = {**keywords, **fkeywords}
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc