2012-07-16 73 views
2

一個另一個函數的參數的方法,我知道這是有效的:如何通過接收參數,在Python

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 

回答

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") 

這允許你傳入任意數量的參數,並且al其中L爲傳遞給你callPrintValue

4

調用函數我想你可以做到這一點


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

撥打電話


callPrintValue(printValue, "abc") 
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通常用於類名稱。

8

有些人發現lambda醜陋,但它是這種情況下的一個有用的工具。您可以使用lambda快速定義一個將參數綁定到printValue()的新函數,而不是修改callPrintValue()的簽名。您是否真的想要這樣做取決於很多因素,並且可能會像其他人所建議的那樣添加*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

我同意'lambda'可所謂這裏(+1)。事實上,這就是GUI編程中的常用方法(例如'tkinter'),因爲您沒有辦法修改執行回調的函數。 – mgilson 2012-07-16 13:01:58