我有一个接收一个函数参数的函数,该函数参数也接收一个参数,但我不知道如何将这个参数传递给python中的参数函数。以下是示例代码:
def pr(text):
print(text)
def frun(func):
func()
frun(pr)
问题是如何在text
中传递frun(pr)
参数?
请考虑使用关键字参数。
答案 0 :(得分:2)
如果你只有一个参数,你可以这样做:
def pr(text):
print(text)
def frun(func, text):
func(text)
frun(pr, "blah")
否则,您可以使用变量参数“magic”,如:
def pr(text):
print(text)
def frun(func, *args):
func(*args)
frun(pr, "blah")
后者的可读性差得多,可能导致奇怪的错误(在这种情况下,它甚至不能使用多个参数传递,因为pr
只需要一个位置参数),有时仍然需要。例如,当您不知道先验您的函数需要多少参数时:
def pr1(text):
print(text)
def pr2(text, note):
print(text, note)
def frun(func, *args):
func(*args)
frun(pr1, "foobarbaz")
frun(pr2, "blah", "IT WORKS!")
答案 1 :(得分:1)
TL; DR: Partial Application
问题归结为将func
的参数传递给您想要进行评估的范围。有几种方法可以做到这一点。
显式参数化
如果您有许多函数或深度函数调用树,这会变得难以处理。
def pr(text):
print(text)
def frun(func, *func_args):
func(*func_args)
frun(pr, *pr_args)
<强> Deferred Execution with Lambda 强>
限制:当您创建func
时,您需要同时提供lambda
的所有参数。
def pr(text):
print(text)
def frun(func):
func()
frun(lambda: pr(*pr_args))
<强> Partial Application 强>
这里好处是你可以在传递对象时进行部分应用。如果partial
使用命名变量,那么就消除了参数的排序问题。
from functools import partial
def pr(text):
print(text)
def frun(func):
func()
frun(partial(pr, *pr_args))
答案 2 :(得分:0)
您可以使用lambda
函数将pr
函数与参数一起传递给frun
函数,而无需更改代码。
def pr(text):
print(text)
# just another example to show how to pass more than one argument.
def pr2(text, note):
print(text, note)
def frun(func):
func()
frun(lambda: pr('Hello'))
frun(lambda: pr2('Hello', 'World'))
Hello
Hello World
另一种可能对您有用的方法是将func
作为frun
函数返回callback
,
然后使用参数调用它:
def pr(text):
print(text)
# just another example to show how to pass more than one argument.
def pr2(text, note):
print(text, note)
def frun(func):
# do some stuff
return func
frun(pr)('Hello')
frun(pr2)('Hello', 'World')
Hello
Hello World