2009-06-19 139 views
4

我有一類函數,需要「通過」特定關鍵字參數:直通關鍵字參數

def createOrOpenTable(self, tableName, schema, asType=Table): 
    if self.tableExists(tableName): 
     return self.openTable(tableName, asType=asType) 
    else: 
     return self.createTable(self, tableName, schema, asType=asType) 

當我打電話吧,我得到這樣的錯誤:

TypeError: createTable() got multiple values for keyword argument 'asType' 

有什麼辦法可以「傳遞」這樣的關鍵字參數嗎?

我想過幾個答案,但沒有一個是最佳的。從最差到最好:

  • 我可以改變一個或多個功能的關鍵字的名字,但我想用相同的關鍵字的所有三種功能,因爲參數攜帶相同的含義。

  • 我可以通過位置,而不是通過關鍵字傳遞asType參數,但如果我添加其他關鍵字參數openTablecreateTable,我會記得要改變通話。我寧願它會自動適應,就像我可以使用關鍵字表單一樣。

  • 我可以在這裏使用**args表單而不是使用默認參數來獲取關鍵字參數的字典,但這似乎是使用大錘猛擊蒼蠅(因爲需要額外的代碼行來正確解析它)。

有沒有更好的解決方案?

回答

9

你這樣做是正確的...只是拿出第二函數調用了:) self

return self.createTable(self, tableName, schema, asType=asType) 

應該是:

return self.createTable(tableName, schema, asType=asType) 
+0

D'哦正如!可能很明顯,我對Python還是個新手,感謝您指出了這個問題 – 2009-06-19 14:50:12

+0

沒問題:) 雖然Python總體來說還是很不錯的,但是這些小小的「陷阱」中很少有這些會嚴重燒燬你當你第一次打他們。如果你還沒有定義一個沒有「自我」參數的方法,你會擊中的另一個......你的程序將死於一個非常有用的「不正確的參數數量」錯誤。 – 2009-06-19 16:29:49

+0

是的,我早打了。幸運的是,我很快就接觸到了這個問題。 – 2009-06-20 02:23:15

5

我不得不說,我第一次想到更復雜的問題。但大衛沃勒弗的回答絕對正確。這只是重複的自我,造成了這個問題。通過這種方式,位置參數脫節並且asType被賦予一個值作爲possitional參數(一次)和關鍵字參數(第二次!)。

一個更有趣的問題是,當你想增強被調用的例程(例子中的createTable)而不是每次增強中間函數時該怎麼做。在這裏,** ARGS解決方案使絕招:

例如:

def createOrOpenTable(self, tableName, schema, **args): 
    if self.tableExists(tableName): 
     return self.openTable(tableName, **args) 
    else: 
     return self.createTable(tableName, schema, **args) 

通過這種方式,可以提高CREATETABLE和OpenTable的簽名,而無需更改任何createOrOpenTable更多。

當創建和OpenTable的可以有不同的關鍵字參數,那麼當然既例程必須定義如下:

def createTable(self, tableName, schema, asType=None, **others): 
    ... 

其餘參數吃掉未知的方法的任何關鍵字參數 - 它也是不需要評估它。

5

我會發表評論Juergen的帖子,但我需要寫一個代碼示例。這裏有一點點更寬泛的版本:「直通」

def createOrOpenTable(self, tableName, schema, *args, **argd): 
    if self.tableExists(tableName): 
     return self.openTable(tableName, *args, **argd) 
    else: 
     return self.createTable(tableName, schema, *args, **argd) 

這將使位置參數也有效(這是很重要的,如果你真的希望這是一個