如何在Python中传递接收参数作为另一个函数的参数的方法

时间:2012-07-16 12:50:27

标签: python parameter-passing

我知道这是有效的:

def printValue():
    print 'This is the printValue() method'

def callPrintValue(methodName):
    methodName()
    print 'This is the callPrintValue() method'

但有没有办法传递一个接收参数的方法作为另一个函数的参数?

这样做是不可能的:

def printValue(value):
    print 'This is the printValue() method. The value is %s'%(value)

def callPrintValue(methodName):
    methodName()
    print 'This is the callPrintValue() method'

这是我得到的堆栈跟踪:

This is the printValue() method. The value is dsdsd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in callPrintValue
TypeError: 'NoneType' object is not callable

5 个答案:

答案 0 :(得分:8)

有些人发现lambda丑陋,但在这种情况下它是一个有用的工具。您可以使用callPrintValue()快速定义将参数绑定到lambda的新函数,而不是修改printValue()的签名。您是否真的想要这样做取决于许多因素,并且可能会像其他人建议的那样添加*args参数。不过,这是一个值得考虑的选择。以下工作无需修改您当前的代码:

>>> callPrintValue(lambda: printValue('"Hello, I am a value"'))
This is the printValue() method. The value is "Hello, I am a value"
This is the callPrintValue() method

答案 1 :(得分:6)

def printValue(value):
    print 'This is the printValue() method. The value is %s'%(value)

def callPrintValue(methodName, *args):
    methodName(*args)
    print 'This is the callPrintValue() method'

然后你可以这样称呼它:

callPrintValue(printValue, "Value to pass to printValue")

这允许您传入任意数量的参数,并将所有参数传递给您在callPrintValue

中调用的函数

答案 2 :(得分:4)

我想你可以做到这一点


def callPrintValue(methodName, *args):
    methodName(*args)
    print 'This is the callPrintValue() method'

拨打电话


callPrintValue(printValue, "abc")

答案 3 :(得分:3)

你想使用元组解包:

def print_value(*values):
    print values

def call_print_value(func,args=None):
    func(*args)

call_print_value(print_value,args=('this','works')) #prints ('this', 'works')

从API的角度来看,我更喜欢将作为单独关键字传递的参数保留。 (然后,print_value使用哪些参数以及call_print_value正在使用哪些参数更明确一些。另请注意,在python中,习惯上将函数(和方法)名称设为name_with_underscores。 CamelCase通常用于类名。

答案 4 :(得分:2)

作为已经提供的答案的后续内容,您可能需要查看有关stackoverflow的以下问题,以便更好地理解python中的* args和/或** kwargs和lambda

  1. What does *args and **kwargs mean?
  2. What does ** (double star) and * (star) do for python parameters?
  3. Python Lambda - why?