2010-06-28 7 views
5

wyobrazić to:pythonowy sposób do funkcji/metod z wielu argumentów

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

Linia wiadukt 79 znaków, więc jaka jest pythonic sposób go multilinii?

+3

Rozważ grupowanie parametrów w spójny danych posiadających zajęcia – manifest

+0

Dla wszystkich, wiem o * args, ale nie mogę grupa argumenty w ten sposób, ponieważ używam podzbioru Pythona, który nie pozwala tej składni . – mkotechno

Odpowiedz

4

że wcięcia kolejne linie 2 poziomy:

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

+1 i zaakceptowany, ponieważ właśnie odpowiedział na pytanie zakładając, że nie jestem idiotą, a rozwiązanie jest kompatybilne z wcięciami spacji i tabulacji. – mkotechno

19

można dołączyć przerwy linii w nawiasach() lub wsporniki, na przykład

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

(ilość spacji aby to jest, oczywiście, zależy od ciebie)

Ale w tym przypadku, można również rozważyć

def method(self, *args): 
    pass 

i/lub

def method(self, **kwargs): 
    pass 

w zależności od sposobu użycia argumentów (i sposobu wywoływania funkcji).

+1

+1 dla '* args' i' ** kwargs' –

+0

Kolejne +1 dla '* args' i' ** kwargs' – gomad

+0

+1 wiele linii z nawiasami. Zajęło mi trochę czasu, aby dowiedzieć się, że możesz to zrobić i wielu początkujących nie są świadomi jego wygody. Pożegnaj się z brzydkim \! – manifest

1

Jeśli masz funkcję, która trwa tak wiele zmiennych jako argumenty, ostatnią rzeczą, którą musisz się martwić o to wcięcie

+0

Naprawdę nie jest to jednak odpowiedź? –

+0

Chcę w górę głosować to tak źle, ale tak ... Powinien być komentarz. – Shog9

1

po prostu podzielić się otwartym uchwytem raz 79 jest trafiony, to tak:

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

A kiedy nazwy są zbyt długo zostać wprowadzone po nawiasie otwierającym, robię to tak:

x.long_function_is_long(
    long_argument_is_loooooooooooooooooooooooooooooooooooooooong, 
    longer_argument_is_looooooooooooooooooooooooooooooooooooooooonger 
) 
-2

I zazwyczaj to zrobić, nie wiem, czy to najlepszy, ale w orki. Ponieważ mam podzielić linię robię je równie dłużej (jeśli mogę):

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

Ponadto, mając taką ilość parametrów polecam takie same jak Dawida, użyj *args

+1

Znak \ jest niepotrzebny. W Pythonie, grupowanie za pomocą nawiasów pozwala kodowi na rozciągnięcie wielu linii - jest to wskazane w PEP 8 http://www.python.org/dev/peps/pep-0008/. –

+0

Nie wiedziałem o tym. Dzięki :) –

9

myślę " Pythonicznym sposobem odpowiedzi jest spojrzenie głębsze niż składnia. Podanie wielu argumentów do metody wskazuje na prawdopodobny problem z modelem obiektu.

  1. Po pierwsze, czy naprawdę trzeba przekazać tak wiele argumentów tej metodzie? Być może jest to wskazówka, że ​​praca mogłaby być lepiej wykonana gdzie indziej (przez obiekt, który już ma dostęp do zmiennych)?

  2. Jeśli to naprawdę jest najlepsze miejsce dla metody, to czy niektóre z tych argumentów mogą być dostarczone jako zmienne instancji samego obiektu (przez self)?

  3. Jeśli nie, czy możesz przedefiniować obowiązki obiektu nadrzędnego, aby je uwzględnić?

  4. Jeśli nie, czy można zamknąć dowolny z indywidualnych argumentów w obiekcie złożonym, który formalizuje relację między nimi? Jeśli którykolwiek z argumentów ma coś wspólnego, powinno to być możliwe.