2012-06-11 16 views
5

tengo este código:Python inicialización

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

Estoy pensando en reemplazarlo con:

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

¿Es esta una mala idea? ¿Hay alguna forma mejor de hacer esto?

+1

posible que desee tener cuidado con el argumento de uno mismo, pero por lo demás se ve bien – lxop

+0

Será el número de entradas de cambiar, o hay un número determinado? – HodofHod

+0

Gracias Ixop, El número de entrada no cambiará. –

Respuesta

2

Sobre la base de comentario de @ ThiefMaster sobre **kwargs:

Si usted está tomando en 20 argumentos, podría tener más sentido exigir a sus usuarios enviar argumentos a través de palabras clave en lugar de la posición: con 20 argumentos, hay una decente posibilidad de que alguien que use su código obtenga los argumentos en el orden incorrecto.

Considere solo aceptando kwargs mientras tiene una lista predefinida de claves que desea aceptar y levantando un ValueError si no las recibe. Entonces puedes usar **kwargs y luego verificar que todo esté allí. P.ej.

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) 

No estoy seguro de si esto es más o menos Pythonic del original, pero parece que se ahorraría un montón de tiempo más adelante, cuando tratando de averiguar por qué alguien que use su código podría estar recibiendo errores extraños.

+0

Si el OP espera el mismo número de argumentos en cada llamada (eso se dijo en un comentario), yo iría con '==' en lugar de 'issubset' - no quiero que el usuario agregue otros argumentos aleatorios que ¡no hagas nada más que contaminar el espacio de nombres! – weronika

9

Desde Zen of Python: Simple es mejor que complejo. y La legibilidad cuenta.

Las asignaciones explícitas son mucho más fáciles de leer y más simples que usar magia para establecer los valores.

+1

+1 no es necesario ofuscar – Levon

+0

El problema es que hay aproximadamente 20 de estas variables; ¿La asignación explícita es aún mejor? y por asignación explícita, ¿quiere decir "self.a = a", etc.? –

+2

Un método que acepta 20 variables suena mal. ¿Has considerado aceptar '** kwargs' y hacer' self .__ dict __. Update (kwargs) '? – ThiefMaster

1

Considere siempre la legibilidad sobre el diseño inteligente. ¿El código de reemplazo es más fácil de leer? Probablemente lo deje. Recuerde que simple es mejor que complejo. Como dijo ThiefMaster, las asignaciones explícitas son más legibles.

0

Otra alternativa para los usuarios de Python3: el decorador init de drastic.

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