2012-06-11 9 views
5

Ich habe diesen Code:Python Initialisierung

def __init__(self, a, b, c, d...): 
    self.a = a 
    self.b = b 
    etc 

Ich denke, es mit ersetzen:

def __init__(self, a, b, c, d...): 
    args=locals() 
    for key in args: 
    self.__dict__[key] = args[key] 

Ist dies eine schlechte Idee? Gibt es bessere Möglichkeiten, dies zu tun?

+1

Könnte vorsichtig über das Selbst Argument sein wollen, sieht aber sonst OK – lxop

+0

Ist die Anzahl der Eingänge zu ändern, oder gibt es eine festgelegte Anzahl? – HodofHod

+0

Danke Ixop, Die Anzahl der Eingaben wird nicht geändert. –

Antwort

2

Aufbauend auf @ ThiefMaster Kommentar über **kwargs:

Wenn Sie in 20 Argumente nehmen, könnte es mehr Sinn machen, Ihre Benutzer benötigen Argumente über Schlüsselwort zu schicken statt Position: mit 20 Argumenten, ist es ein anständiges Chance, dass jemand, der Ihren Code verwendet, die Argumente in der falschen Reihenfolge erhält.

Betrachten Sie nur akzeptieren Kwargen mit einer vordefinierten Liste von Schlüsseln, die Sie akzeptieren möchten und einen ValueError, wenn Sie sie nicht erhalten. So könnten Sie **kwargs verwenden und dann überprüfen, ob alles da ist. Z.B.

INITIAL_ARGS = set(['a','b','c','d','e'...]) 

def __init__(self, **kwargs): 
    if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())): 
     raise ValueError("Class <myclass> requires 20 keyword arguments" 
          "only given %d" % len(kwargs)) 
    self.__dict__.update(kwargs) 

Nicht sicher, ob dies mehr oder weniger Pythonic als die ursprüngliche, aber es scheint, wie es eine Menge Zeit sparen würde später, wenn sie versuchen, herauszufinden, warum jemand Ihren Code seltsame Fehler bekommen könnte.

+0

Wenn das OP die gleiche Anzahl von Argumenten in jedem Aufruf erwartet (das wurde in einem Kommentar gesagt), würde ich mit '==' anstatt 'issubset' gehen - will nicht, dass der Benutzer andere zufällige Schlüsselwortargumente hinzufügt Tu nichts, aber verschmutze den Namensraum! – weronika

9

Von der Zen of Python: Einfach ist besser als komplex. und Lesbarkeit zählt.

Die expliziten Zuweisungen sind viel besser lesbar und einfacher als die Verwendung von Magie zum Festlegen der Werte.

+1

+1 keine Notwendigkeit zu verschleiern – Levon

+0

Die Sache ist, gibt es etwa 20 solcher Variablen; ist explizite Zuordnung noch besser? und durch explizite Zuordnung meinen Sie "self.a = a", etc? –

+2

Eine Methode, die 20 Variablen akzeptiert, klingt schlecht. Habt ihr in Betracht gezogen, '** kwargs' zu akzeptieren und' self.__ dict __. Update (kwargs) '? – ThiefMaster

1

Immer Lesbarkeit über cleveres Design berücksichtigen. Ist der Ersetzungscode leichter zu lesen? Ich würde es wahrscheinlich einfach verlassen. Denken Sie daran, dass einfach ist besser als komplex. Wie der ThiefMaster sagte, sind die expliziten Zuweisungen besser lesbar.

0

Eine weitere Alternative für Python3-Benutzer: der init Dekorateur von drastic.

@init 
def __init__(self, a, b, c, d, e, f, g, h): 
    # nothing to write here! 
Verwandte Themen