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

时间:2014-01-19 15:53:10

标签: python arguments function-pointers

我有一个接收一个函数参数的函数,该函数参数也接收一个参数,但我不知道如何将这个参数传递给python中的参数函数。以下是示例代码:

def pr(text):
   print(text)

def frun(func):
   func()

frun(pr)

问题是如何在text中传递frun(pr)参数? 请考虑使用关键字参数。

3 个答案:

答案 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