传递带有 "implicit" 参数的函数
Passing a function with an "implicit" argument
我正在使用 Python 中的一个包中的 class,我向其中传递的函数必须 只有一个参数 ,例如:
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
您可以在一个元组中传递您的参数,该元组是一个参数,但其中包含任意数量的元素。然后你可以将它传递给你的第二个函数,将它扩展到它的各个参数中。示例:
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'
你应该使用 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
函数用于部分函数应用,它“冻结”函数参数的某些部分 and/or 关键字,从而产生具有简化签名的新对象。
这是一个例子:
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'
我正在使用 Python 中的一个包中的 class,我向其中传递的函数必须 只有一个参数 ,例如:
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
您可以在一个元组中传递您的参数,该元组是一个参数,但其中包含任意数量的元素。然后你可以将它传递给你的第二个函数,将它扩展到它的各个参数中。示例:
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'
你应该使用 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
函数用于部分函数应用,它“冻结”函数参数的某些部分 and/or 关键字,从而产生具有简化签名的新对象。
这是一个例子:
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'