2016-04-28 8 views
0

Ich rufe einen Konstruktor mit Argumenten s = 1, t = 2, y = 3, aber ohne p. Da p nicht definiert ist, wird es nicht festgelegt. Ich habe überlegt, * anstelle von ** zu verwenden, aber ich möchte immer noch Schlüsselwörter verwenden.Wie kann ich Schlüsselwortvarargs in einem Python-Konstruktor zuweisen?

class Creator(object): 

    def __init__(self, **kwargs): 
     if len(kwargs) > 1: 
      self.scenario = kwargs.pop('s') 
      self.t = kwargs.pop('t') 
      self.y = kwargs.pop('y') 
      self.p = kwargs.pop('p') 

Wie kann ich die Parameter analysieren I (das heißt var (kw) args) ausgewählt haben, während Zuordnung derer ignoriert, die ich bestanden haben, nicht wahr?

+0

_Because p nicht definiert ist, ist es nicht auf Gegenteil ist set_, ** ist ** auf "Keine" eingestellt. Die lokale Variable 'scenario' bricht ein Muster auf, und ohne ein klares Muster können Sie keinen generischen Code für die Neuzuordnung von Kwarts zu Instanzvariablen schreiben. Können Sie präzisieren, was Sie mit _parsing alle Parameter_ meinen? –

+0

Ich erhalte eine 'KeyError:' beim Versuch, p zuzuweisen – noumenal

+0

@Rogalski Bearbeitet in Antwort auf den Kommentar – noumenal

Antwort

1

Da kwargs nichts anderes als dict ist, können alle dict-Methoden darauf angewendet werden.

Insbesondere, wenn Sie potenziell abwesenden Wert davon abrufen möchten, können Sie dict.get verwenden.

Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None, so that this method never raises a KeyError.

So wird Code aussehen wie folgt:

self.p = kwargs.get('p') # self.p will be None if "p" is not in kwargs 
self.p = kwargs.get('p', MY_VALUE) # self.p will be MY_VALUE if "p" is not in kwargs 

Alternativ wird Standard-Check für die Mitgliedschaft gut tun:

if 'p' not in kwargs: 
    pass # do something 
Verwandte Themen