2011-01-27 22 views
5

recientemente he empezado a utilizar Python 2.6 para administración del servidor Ubuntu y tienen dos problemas menores en relación con la redundancia:evitar la redundancia en Python

Lo primero son las importaciones: todos se parecen algo así como Clase

importación de la clase

from class import Class 

Y la segunda cosa son __init__ métodos:

__init__(self,arg1,...,argn): 
    self.arg1 = arg1 
    ... 
    self.argn = argn 

¿Hay formas de evitar estas duplicaciones?

Respuesta

7

Lo segundo no es redundancia: es establecer atributos de instancia. Puede hacerlo también así:

class Foo: 

    def __init__(self, **kwargs): 
     for name, value in kwargs.items(): 
      setattr(self, name, value) 

Pero entonces usted necesita llamar a Foo así:

Foo(arg1=1, arg2=2, arg3=3) 

también su importación parece tener la sintaxis incorrecta. Debe ser from Class import Class. Esto parece redundante para usted, porque parece que está almacenando cada clase en un archivo separado (módulo), y eso es exactamente redundante. Python no es Java, por lo general debería contener más objetos en un módulo. Tenga en cuenta que ese módulo en sí es un objeto. También debe nombrar los módulos correctamente: la guía de estilo de código predeterminada indica que los módulos deben ser minúsculas sin caracteres especiales. Como re o urllib por ejemplo.

+0

¡Gracias ya! Corregí mi importación y a partir de ahora mantendré los módulos en minúscula. ¿Cómo podría uno manejar/editar módulos grandes de manera efectiva sin dividirlos? – Jasper

+0

¿Qué quieres decir con módulos grandes? ¿3k líneas de código son un gran módulo? Tal módulo puede contener muchas clases. Puede codificar mucho más escasamente en python que en 'Java' /' C++ ', por lo que mantener múltiples clases en el módulo no significa que sea grande. – gruszczy

1

Versión para args:

class Foo: 

    def __init__(self, *args): 
     for index,arg in enumerate(args): 
      setattr(self, 'arg%s'%index, arg) 


Foo(1,2,3) 
>>> Foo.arg0 
1 
+2

esto es feo ... – aaronasterling

+0

Estoy de acuerdo, esto no es para nada pitónico. Explícito es mejor que implícito, y esto me parece un caso leve de magia implícita. –

+1

* Esperemos que * los nombres de los atributos reales no sean arg0 a través de argN, porque si lo son, deberían ser una secuencia. Si no lo son, esta respuesta no se aplica. –

2
from module import Class 

Es común que los nombres de las clases sean diferentes de su nombre que contiene del módulo. Si solo tiene una clase por módulo con un nombre idéntico, considere mover esa clase a un nivel en su jerarquía.

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

Esto a menudo parecen ser un poco molesto, pero en realidad no es mala, la legibilidad a gota, en comparación con las alternativas. Sin embargo, si tiene muchos parámetros que simplemente asigna como atributos sin otro trabajo en su inicio, considere la posibilidad de heredar de una ruta de acceso nombrada o similar, que puede generar dicho modelo para usted. (Namedtuple en particular tiene otras ramificaciones y solo será adecuado algunas veces. Lo estoy usando como ejemplo de una clase base que puede manejar este tipo de repetitivo).

Cuestiones relacionadas