python-3.x 使用lambda来定义基于另一个函数的函数:如何保持代码的通用性?

6vl6ewon  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(139)

我有一些python代码,它基于一个旧函数定义了一个新函数。

def myFunction(a: int, b: int, c: int):
    # Do stuff

myNewFunction = lambda a, b: myFunction(a, b, 0)

我的新函数与旧函数相同,但将最后一个参数设置为0。
我的问题:假设我不知道这个函数有三个参数,我能让上面的解决方案更通用吗?一个意图正确的无效解决方案可能是这样的:

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)
pjngdqdw

pjngdqdw1#

你几乎是正确的,你可以这样使用functools.partial(而不是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)

从技术上讲,partial不是一个函数,它是一个类,但我不认为这是你所关心的。
如果你想让它成为一个函数类型,文档中有一个与原始partial(大致)等价的纯Python:

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

相关问题