[英]send arguments for function arguments in python
我有一个函数接收一个函数参数,该函数参数也接收一个参数,但我不知道如何将此参数传递给python中的参数函数。 以下是示例代码:
def pr(text):
print(text)
def frun(func):
func()
frun(pr)
问题是如何在frun(pr)
传递text
参数? 请考虑使用关键字参数。
如果你只有一个参数,你可以这样做:
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!")
TL; DR: 部分申请
问题归结为将func
的参数传递给您想要进行评估的范围。有几种方法可以做到这一点。
显式参数化
如果您有许多函数或深度函数调用树,这将变得笨拙。
def pr(text):
print(text)
def frun(func, *func_args):
func(*func_args)
frun(pr, *pr_args)
限制:当您创建lambda
时,需要同时提供func
所有参数。
def pr(text):
print(text)
def frun(func):
func()
frun(lambda: pr(*pr_args))
这里的好处是你可以在传递对象时进行部分应用。 如果您partial
使用命名变量,那么您将消除参数的排序问题。
from functools import partial
def pr(text):
print(text)
def frun(func):
func()
frun(partial(pr, *pr_args))
您可以使用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
另一种可能对你有用的方法是将frun
func
作为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.