Python 用lambda重构部分函数

Python 用lambda重构部分函数,python,Python,在官方文件中 关于局部 大致相当于: def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*args, *fargs, **newkeywords) newfunc.func = func n

在官方文件中 关于局部

大致相当于:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc
我试图理解同义功能的普遍结构

partial = lambda func, *args, **kwargs: func(*args, **kwargs)

我的理解有意义吗?

你错过了两件大事


首先,您的版本不会传递关键字参数。要做到这一点,您还需要将它们展开:

lambda *args, **kwargs: func(*args, **kwargs)

但让我们暂时忽略这一点。更大的问题是缺少部分参数,这是
partial
的全部要点。例如:

>>> def f(a, b):
...     return a + b
>>> add2 = partial(f, 2)
>>> add2(3)
5
>>> add2 = lambda *args: f(*args)
>>> add2(3)
f() missing 1 required positional argument: 'b'
要执行相同的操作,您需要执行以下操作:

>>> add2 = lambda *args: f(2, *args)
>>> add2(3)
5
…或者,相当于:

>>> add2 = lambda *args: f(*((2,) + args))
>>> add2(3)
5

此外,这里没有很好的理由使用
lambda
lambda
的要点是:(a)您不必给出名称,(b)您可以在表达式中使用它。如果您只是想在赋值语句中使用它来命名,最好使用
def

def add2(*args): return f(*((2,) + args))

你错过了两件大事


首先,您的版本不会传递关键字参数。要做到这一点,您还需要将它们展开:

lambda *args, **kwargs: func(*args, **kwargs)

但让我们暂时忽略这一点。更大的问题是缺少部分参数,这是
partial
的全部要点。例如:

>>> def f(a, b):
...     return a + b
>>> add2 = partial(f, 2)
>>> add2(3)
5
>>> add2 = lambda *args: f(*args)
>>> add2(3)
f() missing 1 required positional argument: 'b'
要执行相同的操作,您需要执行以下操作:

>>> add2 = lambda *args: f(2, *args)
>>> add2(3)
5
…或者,相当于:

>>> add2 = lambda *args: f(*((2,) + args))
>>> add2(3)
5

此外,这里没有很好的理由使用
lambda
lambda
的要点是:(a)您不必给出名称,(b)您可以在表达式中使用它。如果您只是想在赋值语句中使用它来命名,最好使用
def

def add2(*args): return f(*((2,) + args))

顺便说一句,
lambda
是用来创建匿名函数的,所以通常认为将lambda分配给名称是不好的风格。请参见.BTW,
lambda
是用来创建匿名函数的,因此通常认为将lambda分配给名称是不好的风格。看见