2011-07-14 1 views
0

J'ai une classe qui est _ init _ La fonction nécessite pas mal d'arguments. J'aimerais pouvoir réécrire ce morceau de code pour qu'il soit plus propre sur le plan syntaxique (codage moins dur). Je préférerais pouvoir l'obtenir de telle sorte que l'ajout d'un argument mot-clé à _ init _ changerait tous les attributs/arguments de la fonction nulle respectivement.Manipulation de grandes quantités d'arguments de mots clés d'une manière Pythonienne

class Class : 

    def __init__ (self, kw0=0, kw1=1, kw2=2) : 

     ''' The keyword arguments as strings. ''' 
     self.Keys = ['kw0', 'kw1', 'kw2'] 

     ''' Their values. ''' 
     self.Values = [kw0, kw1, kw2] 

     ''' A dictionary made from the keys and values. ''' 
     self.Dict = self.make_dict() 

     ''' As individual attributes, ''' 
     self.KW0, self.KW1, self.KW2 = self.Values 

    def make_dict (self) : 
     ''' Makes a dictionary ''' 

     keys = self.Keys 
     values = self.Values 

     _dict = {} 
     for i in xrange(len(keys)) : 
      key = keys[i] 
      value = values[i] 

      _dict[key] = value 

     return _dict 

    def null (self, kw0=None, kw1=None, kw2=None) : 
     ''' The same keyword arguments as **__init__** but they all default 
      to **None**. ''' 

     pass 

c = Class() 
print c.Keys 
print c.Values 
print c.Dict 
print c.KW0 
print c.KW1 
print c.KW2 

Répondre

2

Pourquoi ne pas accepter les arguments mot-clé. Vous pouvez utiliser un attribut de classe pour les noms de mot clé autorisés et leurs valeurs par défaut.

class Class(object): 

    _defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!") 

    def __init__(self, **kwargs): 

     # Raise exception if any non-supported keywords supplied 
     if set(kwargs.keys()) - set(self._defaults.keys()): 
      raise KeyError("unsupported keyword argument") 

     # Update our instance with defaults, then keyword args 
     self.__dict__.update(self._defaults) 
     self.__dict__.update(kwargs) 

Si vous voulez la même fonctionnalité dans plus d'une méthode (par exemple __init__() et null()) puis juste briser le code de gestion des arguments sur dans sa propre méthode et appeler des deux endroits. Un inconvénient est que help() et d'autres outils de documentation Python n'afficheront pas les arguments de mot clé autorisés, car ils ne figurent pas dans votre signature de méthode. En passant, je ne sais pas exactement pourquoi vous stockez séparément les clés et les valeurs. Il suffit de les stocker en tant que dictionnaire, puis d'obtenir les clés ou les valeurs lorsque vous le souhaitez en utilisant la méthode .keys() ou .values() du dictionnaire.

+0

Wow c'est un peu génial de leur code, merci! – rectangletangle

3

C'est une chose que j'aime à propos de python. Dans votre __init__

def __init__ (self, **kwargs): 
    self.__dict__.update(kwargs) 

ajoutera les membres définis dans un dictionnaire kwargs en tant que membres de la classe.

ÉDITÉ - pour refléter la syntaxe appropriée pour kwargs **, et mise à jour() au lieu de append()

+0

Aussi ['defaultdict'] (http://docs.python.org/release/3.1.3/library/collections.html#collections.defaultdict), ou la recette' defaultdict' dans les versions de Python en dessous de 2.5. Oh, et @serotonin: vous avez oublié de précéder '**' avant 'kwargs' dans la définition de la fonction afin que les valeurs puissent être saisies en tant que paires mot-clé = valeur dans l'appel de la fonction plutôt que d'avoir à passer un réel' dict'. – JAB

+1

Où sont les valeurs par défaut? – Gerrat

+0

Cela fonctionne pour moi dans 2.6 – dwerner

Questions connexes