我知道这是有效的:
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
答案 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
。