2017-09-14 4 views
3

Beim Versuch, die folgende Klasse instanziiert Ich erhalte die folgende Fehlermeldung:Python: Klassendefinition mit ** kwargs

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

Wissen Sie, was das Problem sein könnte? Hier ist die Klassendefinition:

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) 

Antwort

3

Um schema zu passieren und in **kwargs zu entpacken, müssen Sie verwenden **schema:

db_create_table('Table1', **schema) 

Erläuterung: Die einzelnen Stern Form (*args) entpackt eine Sequenz, um eine Argumentenliste zu bilden, während das Doppelstern-Formular (**kwargs) ein dict-ähnliches Objekt in eine Schlüsselliste mit Argumenten entpackt.

Ohne ein Sternchen wird das gegebene Objekt direkt übergeben, wie es ist, ohne zu entpacken.

Siehe auch how to use *args and **kwargs in Python.

+1

Bei dieser Antwort könnten Sie auch schreiben (vereinfacht): 'db_create_table ('Table1', id = 1, col1 = 2, col2 = 3, CreatedOn = '2017-09')' – rocksteady

0

Sie passieren zwei args, aber fangen nur kwargs.
schema wird als Positionsargument übergeben, das von *args abgefangen würde; wenn man es wollte von **kwargs gefangen werden würden Sie es als Stichwort Argument an:

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

Die Funktion hat kein Argument "Schema" genannt. Vielleicht meintest du "kwargs = schema"? (Selbst dann, ich denke, du brauchst das Doppelsternchen?) – Basya

+0

Es hat kein Argument namens 'schema', nein. Es hat allerdings '** kwargs', und * irgendein * passier * benanntes Argument * wird dorthin gehen. – deceze

+0

@deceze tatsächlich beim Übergeben von schema = Schema und Sie drucken die Klassenvariablen: test = db_create_table ('Table1', schema = schema) print vars (test) Sie können sehen, dass Schema als Zeichenfolge übergeben wird, anstelle der Diktatschlüssel. – Pelican

2

Die kwargs Parameter in der Funktion Schlüsselwort Argumente erfassen; Sie übergeben ein einzelnes Objekt, ohne es zu entpacken.

Sie müssen es entweder mit ** übergeben, damit es ausgepackt wird, oder fügen Sie der Funktionsdefinition * Argumente hinzu. Zum Beispiel sehen, wie die Funktion die Argumente interpretiert:

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

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

Ausgang:

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

Wie Sie Positions args mit * args übergeben, können Sie Keyword-args mit ** kwargs passieren beim Aufruf der Func.

Verwandte Themen