2010-06-28 2 views
5

Stellen Sie sich vor:Pythonic Weg zu Funktionen/Methoden mit vielen Argumenten

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa): 
    pass 

Die Linie Überführung der 79 Zeichen, ja, was ist der pythonic Weg, es zu 'multi?

+3

Betrachten Sie die Parameter in zusammenhängenden Datengruppierungs Klassen – manifest

+0

Für alle halten, ich weiß über * args, aber ich kann nicht Gruppe die Argumente auf diese Weise, weil ich eine Teilmenge von Python bin mit, die diese Syntax nicht erlaubt . – mkotechno

Antwort

4

ich einrücken die nachfolgenden Zeilen 2 Ebenen:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, 
     theta, iota, kappa): 
    pass 
+1

+1 und akzeptiert, weil nur die Frage beantwortet, vorausgesetzt, ich bin kein Idiot, und die Lösung ist mit Leerzeichen und Tabs Einrückung kompatibel. – mkotechno

19

Sie können Zeilenumbrüche in Klammern enthalten (oder Klammern), z.B.

def method(self, alpha, beta, gamma, delta, epsilon, zeta, 
       eta, theta, iota, kappa): 
    pass 

(die Menge von Leerzeichen ist natürlich enthalten, bis zu Ihnen)

Aber in diesem Fall könnten Sie auch

def method(self, *args): 
    pass 

und/oder

def method(self, **kwargs): 
    pass 
betrachten

abhängig davon, wie Sie die Argumente verwenden (und wie die Funktion aufgerufen werden soll).

+1

+1 für '* args' und' ** kwargs' –

+0

Weitere +1 für '* args' und' ** kwargs' – gomad

+0

+1 mehrere Zeilen mit Klammern. Es hat eine Weile gedauert, bis ich herausgefunden habe, dass du das machen kannst und viele Anfänger sind sich seiner Bequemlichkeit nicht bewusst. Verabschiede dich von hässlichen \! – manifest

1

Wenn Sie eine Funktion, die so viele Variablen als Argumente übernimmt, das letzte, was Sie zu befürchten Vertiefung ist

+0

Nicht wirklich eine Antwort, oder? –

+0

Ich möchte das sooo schlecht bewerten, aber ja ... hätte ein Kommentar sein sollen. – Shog9

1

ich teilten nur auf die offene Klammer einmal 79 getroffen wird, wie folgt aus:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, 
      kappa): 

Und wenn Namen zu lang sind, setzen nach der öffnenden Klammer zu, ich mache es wie folgt aus:

x.long_function_is_long(
    long_argument_is_loooooooooooooooooooooooooooooooooooooooong, 
    longer_argument_is_looooooooooooooooooooooooooooooooooooooooonger 
) 
-2

ich dies in der Regel tun, ich weiß nicht, ob es das beste ist, aber es w Orks. Da ich die Linie, die ich ihnen gleich länger spalten (wenn ich kann):

def method(self, alpha, beta, gamma, delta, epsilon, \ 
       zeta, eta, theta, iota, kappa): 
    pass 

Auch solche Menge von Parametern, würde ich das gleiche wie David empfehlen, verwenden *args

+1

Das \ Zeichen ist nicht notwendig. In Python ermöglicht die Gruppierung mit Klammern, dass sich Code über mehrere Zeilen erstreckt - dies wird in PEP 8 http://www.python.org/dev/peps/pep-0008/ angegeben. –

+0

Ich wusste nichts darüber. Vielen Dank :) –

9

ich denke, die ' Die Antwort von Pythonic ist tiefer zu schauen als die Syntax. Die Übergabe von vielen Argumenten an eine Methode weist auf ein wahrscheinliches Problem mit Ihrem Objektmodell hin.

  1. Vor allem, müssen Sie wirklich so viele Argumente an diese Methode übergeben? Vielleicht ist dies ein Hinweis darauf, dass die Arbeit woanders besser erledigt werden könnte (durch ein Objekt, das bereits Zugriff auf die Variablen hat)?

  2. Wenn dies wirklich der beste Platz für die Methode ist, könnten dann einige dieser Argumente als Instanzvariablen dieses Objekts selbst geliefert werden (über self)?

  3. Wenn nicht, können Sie die Verantwortlichkeiten des übergeordneten Objekts neu definieren, um sie einzubeziehen?

  4. Wenn nicht, können Sie die einzelnen Argumente in einem zusammengesetzten Objekt kapseln, das die Beziehung zwischen ihnen formalisiert? Wenn eines der Argumente etwas gemeinsam hat, dann sollte dies möglich sein.

Verwandte Themen