2016-02-25 33 views
0

我有一個方法的類:如何命名變量傳遞給函數在tupled形式的Python

class Learner: 
    def fit(x,y,iterations=1,subsample_proportion=0.1): 
     etc... 
    def predict(X): 
     etc.. 

和一個功能:

def error(learner,learner_args,X,Y): 
    learner.fit(learner_args) 
    Y_pred = learner.predict(X) 
    etc... 

如何讓learner_args元組通過在Python中的這個函數?

現在我有:

learner = ada_boost.AdaBoost 
learner_args = (train_x,train_y,4,0.2) 

而且這是行不通的。

此外,有沒有辦法將命名參數傳遞給函數調用?

如此,例如,在我的功能,我會做:

learner_args = (train_x,train_y,subsample_proportion=0.2) 

忽略迭代。有沒有辦法在Python中做到這一點? (在語言的內部...不是通過使用字典並在任何地方測試數值)

回答

2

在字典前使用**。例如:

def f(a,b, c=0, d='a'): 
    print a,b,c,d 

kwargs = {'a' = 1, 'b' = 2} 
f(**kwargs) 
>>> 1 2 0 a 

編輯:

根據您的意見,您可能希望是這樣的:

args = ('first argument', 'second argument') 
kwargs = {'c':'named argument c', 'd':'named argument d'} 
f(*args, **kwargs) 
>>> 'first argument', 'second argument', 'named argument c', 'named argument d' 
+0

太棒了。謝謝 – bordeo

+0

@bordeo看看編輯後的答案是否適合你 – user2829759

+0

我認爲它確實;我只需要做:'learner_args =(args,kwargs)',當我通過它的時候,'learner.fit(* learner_args [0],** learner_args [1])' – bordeo

1

learner_args很好;你只需要正確傳遞它。

learner.fit(*learner_args) 
+0

啊,真棒。有沒有辦法傳遞命名參數? – bordeo

+0

@bordeo:在字典中使用'**'。例如'** kwargs'。 – zondo

+0

@zondo,真棒......謝謝 – bordeo

相關問題