传递带有“隐式”参数的函数

kek*_*kel 5 python arguments function python-3.x

我正在使用 Python 包中的一个类,我向该类传递必须只有一个参数的函数,例如:

def exampleFunction1(only_argument_1):
    
    doSomething1(only_argument_1) #perform some operations

Run Code Online (Sandbox Code Playgroud)

然后,一旦以上述方式定义了所有需要的函数,我需要以这种方式传递它们:

python_package_class.function1 = exampleFunction1
python_package_class.function2 = exampleFunction2
python_package_class.function3 = exampleFunction3

Run Code Online (Sandbox Code Playgroud)

现在让我们假设 doSomething 对于我的所有函数都是相同的,除了它需要另一个可以更改的参数这一事实,例如(1、2 和 3 只是示例,参数可以是任何内容):

def exampleFunction1(only_argument_1):
    
    doSomething(1, only_argument_1) #perform some operations

def exampleFunction2(only_argument_2):
    
    doSomething(2, only_argument_2) #perform some operations

def exampleFunction3(only_argument_3):
    
    doSomething(3, only_argument_3) #perform some operations

Run Code Online (Sandbox Code Playgroud)

通过仅定义一个 exampleFunction并向其传递两个参数,可以大大简化这一过程:

def exampleFunction(a, only_argument_1):
    
    doSomething(a, only_argument_1) #perform some operations

Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,这会给我带来一个错误,因为正如我所说,我正在使用的 Python 包严格要求函数只接受一个参数。

所以我的问题是,是否有一种“隐式方式”将参数传递 a 给以下代码行中的 exampleFunction ?

python_package_class.function1 = exampleFunction
Run Code Online (Sandbox Code Playgroud)

Ric*_*cco 6

你应该使用functools.partial

\n
from functools import partial\n\ndef exampleFunction(a, only_argument_1):\n    doSomething(a, only_argument_1)\n\npython_package_class.function1 = partial(exampleFunction, 1)\npython_package_class.function2 = partial(exampleFunction, 2)\npython_package_class.function3 = partial(exampleFunction, 3)\n
Run Code Online (Sandbox Code Playgroud)\n

partial函数用于部分函数应用,其中 \xe2\x80\x9c 冻结 \xe2\x80\x9d 函数的某些部分\xe2\x80\x99s 参数和/或关键字,从而产生具有简化签名的新对象。

\n

这是一个例子:

\n
from functools import partial\n\ndef f(arg1, arg2):\n    print(f\'{arg1} {arg2}\')\n\nf1 = partial(f, 1)\nf2 = partial(f, 2)\nf3 = partial(f, 3)\n\nprint(f1(\'a\')) # \'1 a\'\nprint(f2(\'a\')) # \'2 a\'\nprint(f3(\'b\')) # \'3 b\'\n
Run Code Online (Sandbox Code Playgroud)\n