创建一个固定了一些变量的函数的副本

假设我有一个功能

def multiply_by(x, multiplier):
    return x * multiplier

如何创建该函数的副本并修复该函数中的乘数?

multiply_by_5 = multiply_by?    <-- here I need python magic

这样multiply_by_5将只有一个参数x而乘数为5? 以便

multiply_by_5(2)
10

Python 2.7有没有办法做到这一点?


您可以使用带关键字参数的functools.partial

>>> def multiply_by(x, multiplier):
...     return x * multiplier
...
>>> from functools import partial
>>> multiply_by_5 = partial(multiply_by, multiplier=5)
>>> multiply_by_5(2)
10

functools.partial就是为此而设计的。

你可以使用它

import functools
multiply_by_5=functools.partial(multiply_by,multiplier=5)

正如@ n​​iemmi的回答所建议的, functools.partial可能是要走的路。

但是,使用curried函数可以完成类似的工作:

def multiply_by(multiplier):
    def multiply(x):
        return multiplier * x
    return multiply

>>> multiply_by_5 = multiply_by(5)    # no magic
>>> multiply_by_5(2)
10

或者使用lambda语法:

def multiply_by(multiplier):
    return lambda x: multiplier * x

请注意, partial更简洁,更高效,并以标准方式更直接地表达您的意图。 上面的技术是一个叫做闭包的概念的例子,这意味着在内部作用域中定义的函数可以引用在封闭作用域中定义的变量,并且“关闭”它们,记住它们,甚至改变它们。

由于这种技术更通用,因此代码读者可能需要更多时间来理解代码中的具体含义,因为代码可能会非常复杂。


具体用于乘法(和其他运算符) partial可以与operator.mul结合使用:

>>> import functools, operator
>>> multiply_by_5 = functools.partial(operator.mul, 5)
>>> multiply_by_5(2)
10
链接地址: http://www.djcxy.com/p/51121.html

上一篇: Creating a copy of a function with some vars fixed

下一篇: function that is sum of arbitrary many other functions