2017-09-14 5 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)がdict-likeオブジェクトをキーワード付き引数リストに展開する間に、シーケンスをアンパックして引数リストを作成します。

アスタリスクがない場合、指定されたオブジェクトは、アンパックすることなくそのままそのまま渡されます。

how to use *args and **kwargs in Pythonも参照してください。

+1

'db_create_table( 'Table1'、id = 1、col1 = 2、col2 = 3、CreatedOn = '2017-09')' – rocksteady

0

次の2つの引数を渡しているが、唯一のkwargsからをキャッチされています。
schema*argsで捕捉される位置引数として渡されています。あなたはそれが**kwargsによってキャッチされたかった場合はキーワード引数として渡す必要があるだろう:

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

この関数には引数がありませんスキーマと呼ばれます。多分あなたは "kwargs = schema"を意味するのでしょうか? (それでも、二重のアスタリスクが必要だと思います) – Basya

+0

'schema'という名前の引数はありません。それは '** kwargs'を持っていますが、*渡された*任意の引数*がそこに行くでしょう。実際 – deceze

+0

@decezeスキーマ=スキーマを渡し、あなたはクラス変数を印刷している: テスト= db_create_table(「表1」、スキーマ=スキーマ) 印刷VARS(テスト) あなたがそのスキーマが文字列として渡され見ることができますが、 dictキーを持つ代わりに。 – Pelican

2

機能でkwargsからパラメータキーワード引数をキャプチャされます。単一のオブジェクトをアンパックせずに渡しています。

**を渡す必要があるため、アンパックされるか、* argsを関数定義に追加します。たとえば、関数は引数をどのように解釈するかを見て:

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

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

出力:あなたは*引数との位置引数を渡すと、FUNCを呼び出すときに

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

、あなたが** kwargsからとキーワード引数を渡すことができます。

関連する問題