繁体   English   中英

在python中发送函数参数的参数

[英]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延迟执行

限制:当您创建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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM