2015-03-11 1 views
1

Lors de la conception des cours, je l'ai trouvé difficile à placer des valeurs d'argument par défaut dans la méthode __init__, comme dans:Est-il considéré comme une bonne pratique d'utiliser ** kwargs de manière prolifique pour améliorer la lisibilité?

class Class1(object): 
    def __init__(self, y=2, z=3): 
     self.y = self.manip_y(y) 
     self.z = self.manip_z(z) 

    def manip_y(self, y): 
     return y * 10 

    def manip_z(self, z): 
     return z - 30 

Est-il considéré comme une meilleure pratique d'ajouter **kwargs pour fonctionner des signatures pour placer les valeurs par défaut dans les signatures de fonction comme bien ?:

class Class2(object): 
    def __init__(self, **kwargs): 
     self.y = self.manip_y(**kwargs) 
     self.z = self.manip_z(**kwargs) 

    def manip_y(self, y=2, **kwargs): 
     return y * 10 

    def manip_z(self, z=3, **kwargs): 
     return z - 30 
+4

Que trouvez-vous gênant à propos de votre premier exemple? – BrenBarn

+0

Il n'est pas clair ce que vous essayez d'atteindre - pourquoi, par exemple, 'manip_y' est une méthode d'instance publique? Sera-t-il jamais appelé de l'extérieur de '__init__'? – jonrsharpe

+2

Comment "utiliser kwargs de manière prolifique" * aide * la lisibilité? Bien que ce ne soit pas toujours le cas, l'exemple montré avec kwargs est un peu plus difficile à suivre. – user2864740

Répondre

2

Il est préférable d'ajouter des valeurs par défaut dans la signature __init__. Ainsi, une personne n'a qu'à regarder la signature pour déterminer les options. Et, dans l'exemple 2, les valeurs par défaut sont maintenant cachées dans d'autres fonctions. De plus, votre documentation sera plus simple.

1

ne faites pas cela. Pourquoi? car il vous oblige à lire non seulement le code __init__ pour comprendre comment créer l'objet mais aussi toutes les fonctions qui y sont appelées.