2

我知道这是有效的:

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
4

5 回答 5

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
于 2012-07-16T12:59:26.330 回答
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

于 2012-07-16T12:53:00.947 回答
4

我想你可以做到这一点


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

打电话


callPrintValue(printValue, "abc")
于 2012-07-16T12:53:55.397 回答
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 通常用于类名。

于 2012-07-16T12:54:46.927 回答
2

作为已经提供的答案的后续,您可能需要在 stackoverflow 上查看以下问题,以便更好地理解 *args 和/或 **kwargs 以及lambdapython。

  1. *args 和 **kwargs 是什么意思?
  2. **(双星)和*(星)对python参数有什么作用?
  3. Python Lambda - 为什么?
于 2012-07-16T13:02:34.023 回答