使用“隐式”参数传递函数

5

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

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

接下来,一旦以以上方式定义了所有必要的函数,我需要按以下方式传递它们:

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

现在,让我们想象一下,对于我所有的函数来说,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


这可以通过定义仅有一个exampleFunction并向其传递两个参数来大大简化:
def exampleFunction(a, only_argument_1):
    
    doSomething(a, only_argument_1) #perform some operations

但是,不幸的是,因为我提到的Python包严格要求只接受一个参数的函数,所以这会导致出错。

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

python_package_class.function1 = exampleFunction

你能不能把两个参数放在元组或列表里面传递呢?这样函数就只需要一个参数,即一个元组或列表。但是这个参数里面可以包含任意数量的元素。 - Chris Doyle
2个回答

5
你应该使用 functools.partial:
from functools import partial

def exampleFunction(a, only_argument_1):
    doSomething(a, only_argument_1)

python_package_class.function1 = partial(exampleFunction, 1)
python_package_class.function2 = partial(exampleFunction, 2)
python_package_class.function3 = partial(exampleFunction, 3)
partial 函数用于部分函数应用,它会“冻结”函数的某些参数和/或关键字的一部分,从而生成一个具有简化签名的新对象。

下面是一个例子:

from functools import partial

def f(arg1, arg2):
    print(f'{arg1} {arg2}')

f1 = partial(f, 1)
f2 = partial(f, 2)
f3 = partial(f, 3)

print(f1('a')) # '1 a'
print(f2('a')) # '2 a'
print(f3('b')) # '3 b'

2

您可以将参数放在元组中,作为一个参数,但其中包含任意数量的元素。然后,您可以将其传递给第二个函数,并将其展开为各个参数。例如:

def example_function(arg_list):
    other_function(*arg_list)


def other_function(arg_one, arg_two):
    print(f"received args: '{arg_one}', '{arg_two}'")


args = (1, "some_arg")
example_function(args)
args2 = (2, "some_arg")
example_function(args2)

输出

received args: '1', 'some_arg'
received args: '2', 'some_arg'

非常感谢您的回答。我从未考虑过这种解决方案,这可能有效,但实现起来并不直接。我会尝试一下。 - kekel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接