2017-09-14 53 views
3

當試圖實例下面的類我收到以下錯誤:的Python:類定義與** kwargs

"TypeError: __init__() takes exactly 2 arguments (3 given)" 

你知道會產生什麼問題?下面是類的定義:

class db_create_table(): 
     ''' 
      doc here 
     ''' 
     def __init__(self,TableName, **kwargs): 
      self.TableName = TableName 
      for k,v in kwargs.iteritems(): 
       setattr(self, k, k) 


schema = {"id" : { "type":"Integer", "primary":"primary_key=True", "unique":"unique = True"}, 
      "col1" : { "type":"String()", "primary":"primary_key=False", "unique":"unique = True"}, 
      "col2" : { "type":"String()", "primary":"primary_key=False", "unique":"unique = False"}, 
      "col3" : { "type":"String()", "primary":"primary_key=False", "unique":"unique = False"}, 
      "col4" : { "type":"String()", "primary":"primary_key=False", "unique":"unique = False"}, 
      "CreatedOn" : { "type":"DateTime", "primary":"", "unique":"unique = False"}, 
      "UpdatedOn" : { "type":"DateTime", "primary":"primary_key=False", "unique":"unique = False"}, 
          } 


db_create_table('Table1', schema) 

回答

3

爲了通過schema並將其解壓到**kwargs,你必須使用**schema

db_create_table('Table1', **schema) 

說明: 單星號形式(*args)解壓一個序列形成一個參數列表,而雙星號形式(**kwargs)將一個類似於字典的對象解壓到一個keyworded參數列表中。

沒有任何星號,給定的對象將直接通過,沒有任何解包。請參閱how to use *args and **kwargs in Python

+1

詳細說明此答案,您還可以編寫(簡化):'db_create_table('Table1',id = 1,col1 = 2,col2 = 3,CreatedOn ='2017-09')' – rocksteady

0

您正在通過兩個參數,但只能捕獲kwargs
schema正在作爲位置參數傳遞,將被*args捕獲;如果你想讓它由**kwargs被抓住,你就必須把它作爲關鍵字參數:

db_create_table('Table1', schema=schema) 
+0

該函數沒有參數稱爲「模式」。也許你的意思是「kwargs = schema」? (即使那樣,我認爲你需要雙星號?) – Basya

+0

它沒有名爲'schema'的參數,沒有。它確實有'** kwargs',並且*任何*通過*命名參數*將會去那裏。 – deceze

+0

@deceze實際上在傳遞schema = schema並且正在打印類變量時: test = db_create_table('Table1',schema = schema) print vars(test) 您可以看到模式是作爲字符串傳遞的,而不是有字典鍵。 – Pelican

2

kwargs在功能參數採集關鍵字參數;你傳遞一個單獨的對象而不打開它。

您或者需要將它傳遞給**,以便將它解包,或者將* args添加到函數定義中。例如,看功能如何解釋參數:

def func(*args, **kwargs): 
    print args 
    print kwargs 

func(arg) 
func(*arg) 
func(*arg, keyword='key') 

輸出:

(('one', 'two'),) -- passed as arg, single element 
{} 
('one', 'two') -- passed as *arg - object is unpacked 
{} 
('one', 'two') 
{'keyword': 'key'} -- keyword arg looks like that 

。當你穿過帶* ARGS位置指定參數時,你可以調用FUNC時通過與** kwargs關鍵字ARGS。