2010-06-28 9 views
5

Imagínese esto:Pythonic manera de funciones/métodos con una gran cantidad de argumentos

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

La línea de paso elevado los 79 caracteres, así que, ¿cuál es la forma de varias líneas Pythonic a ella?

+3

Considere la agrupación de los parámetros en los datos de cohesión que llevan a cabo las clases – manifest

+0

Para todos, sé de args *, pero no puede agrupar los argumentos de esta manera, porque estoy usando un subconjunto de Python que no permite esta sintaxis . – mkotechno

Respuesta

4

I guión las líneas subsiguientes 2 niveles:

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

+1 y aceptado porque simplemente respondí la pregunta suponiendo que no soy idiota, y la solución es compatible con espacios y sangrías de pestañas. – mkotechno

19

Puede incluir saltos de línea dentro de paréntesis (o soportes), por ejemplo

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

(la cantidad de espacio en blanco para incluir es, por supuesto, depende de usted)

Pero en este caso, también se puede considerar

def method(self, *args): 
    pass 

y/o

def method(self, **kwargs): 
    pass 

dependiendo de cómo use los argumentos (y cómo desea que se llame a la función).

+1

+1 para '* args' y' ** kwargs' –

+0

Otro +1 para '* args' y' ** kwargs' – gomad

+0

+1 líneas múltiples con paréntesis. Me tomó un tiempo descubrir que podrías hacer esto y muchos principiantes no son conscientes de su conveniencia. ¡Adiós a feo! – manifest

1

Si usted tiene una función que toma tantas variables como argumentos, la última cosa que tiene que preocuparse es muesca

+0

No es realmente una respuesta, ¿verdad? –

+0

Quiero votar tan mal, pero sí ... Debería haber sido un comentario. – Shog9

1

acabo de dividir a la abrazadera abierta es golpeado una vez 79, así:

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

Y cuando los nombres son demasiado largos para ser puesto después del paréntesis de apertura, lo hago de esta manera:

x.long_function_is_long(
    long_argument_is_loooooooooooooooooooooooooooooooooooooooong, 
    longer_argument_is_looooooooooooooooooooooooooooooooooooooooonger 
) 
-2

que suelo hacer esto, no sé si es la mejor, pero w orks. Desde que tengo que dividir la línea de las hago igual de largo (si puedo):

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

Además, tener tal cantidad de parámetros que recomendaría lo mismo que David, utilice *args

+1

El carácter \ no es necesario. En Python, la agrupación con paréntesis permite que el código abarque varias líneas; esto se señala en PEP 8 http://www.python.org/dev/peps/pep-0008/. –

+0

No sabía de eso. Gracias :) –

9

creo que el ' La forma pitonica de responder a esto es mirar mas profundo que la sintaxis. Pasar tantos argumentos a un método indica un problema probable con su modelo de objetos.

  1. Antes que nada, ¿realmente necesita pasar esa cantidad de argumentos a este método? Tal vez esto es una indicación de que el trabajo podría realizarse mejor en otro lugar (por un objeto que ya tiene acceso a las variables)?

  2. Si este es realmente el mejor lugar para el método, ¿podrían algunos de esos argumentos ser suministrados como variables de instancia de este objeto en sí (a través de self)?

  3. Si no, ¿puede redefinir las responsabilidades del objeto principal para incluirlas?

  4. Si no, ¿puede encapsular cualquiera de los argumentos individuales en un objeto compuesto que formaliza la relación entre ellos? Si alguno de los argumentos tiene algo en común, entonces esto debería ser posible.

Cuestiones relacionadas