J'ai une définition de classe comme suit:

class Trade:
  def __init__(self, **kwargs):
    # lots of things

J'essaie d'instancier un en faisant:

trade_tmp = Trade(json.loads(trade_str))

J'ai cru comprendre que l'argument **kwargs ramasserait automatiquement le dictionnaire généré. Suis-je incorrect?

J'obtiens toute l'erreur takes 1 positional argument but 2 were given que je ne devrais pas appliquer ici.

1
Chapo 7 mars 2019 à 04:42

2 réponses

Meilleure réponse

Le dict retourné par json.loads sert d'argument unique à la fonction. Par conséquent, vous avez besoin d'un autre argument positionnel:

def __init__(self, data, **kwargs)

Bien que vous puissiez ajouter deux départs avant le dict pour le forcer en tant qu'arguments de mots clés, il n'est pas conçu à cet effet et je le déconseille:

# it's valid, but don't do this
Trade(**json.loads(trade_str))
1
iBug 7 mars 2019 à 01:46

Deux choix, en utilisant args ou kwargs:

import json

class Trade1:
  def __init__(self, **kwargs):
      print(kwargs)

class Trade2:
  def __init__(self, *args):
      print(args)

trade_str = '{"a": 1, "b": 2}'
trade_tmp1 = Trade1(**json.loads(trade_str))
trade_tmp2 = Trade2(json.loads(trade_str))
0
Thinh Pham 7 mars 2019 à 01:50