51 votes

constantes en Python : à la racine du module ou dans un espace de noms à l'intérieur du module ?

Je construis un module Python avec une centaine de constantes.

J'aimerais éviter les problèmes de nommage lorsque les gens importent mon module, alors je me demandais quelle serait la meilleure façon de le faire.

 MY_CONSTANT = 1
MY_SECOND_CONSTANT = 2
...
MY2_CONSTANT = "a"
MY2_SECOND_CONSTANT = "b"
...

Ou

 class My:
  CONSTANT = 1
  SECOND_CONSTANT = 2
  ...

class My2
  CONSTANT = "a"
  SECOND_CONSTANT = "b"
  ...

Ou peut-être une autre de vos suggestions ?

Venant de Java, je préfère sûrement la deuxième voie, mais certains pourraient la trouver exagérée...

29voto

Michal Chruszcz Points 1446

Chaque module fournit son propre espace de noms, il n'est donc pas nécessaire d'en créer un autre.

Ayant le module foo.py :

 FOO = 1
BAR = 2
SHMOO = 3

vous pouvez l'utiliser comme ceci :

 import foo
foo.BAR

18voto

Sergey Vedernikov Points 2462

Du guide de style : Les constantes sont généralement définies au niveau du module et écrites dans tous les majuscules avec des traits de soulignement séparant les mots. Les exemples comprennent MAX_OVERFLOW et TOTAL.

5voto

Vit Bernatik Points 56

Si vous utilisez des classes, vous pouvez interdire l'écrasement des constantes (ou même interdire l'ajout de constantes à cette classe). L'avantage d'utiliser la classe plutôt que les fichiers (modules) est également que lorsque vous avez de nombreux groupes, vous n'avez pas besoin d'avoir beaucoup de fichiers.

Donc ça ressemblerait à ça :

 class MyConstBaseClass: 
    """
    forbids to overwrite existing variables 
    forbids to add new values if "locked" variable exists
    """ 
    def __setattr__(self,name,value):
        if(self.__dict__.has_key("locked")):    
            raise NameError("Class is locked can not add any attributes (%s)"%name)
        if self.__dict__.has_key(name):
            raise NameError("Can't rebind const(%s)"%name)
        self.__dict__[name]=value

class MY_CONST_GRP1(MyConstBaseClass):
    def __init__(self):
        self.const1 = "g1c1"
        self.const2 = "g1c2"
my_const_grp1 = MY_CONST_GRP1()

class MY_CONST_GRP2(MyConstBaseClass):
    def __init__(self):
        self.const1 = "g2c1"
        self.const3 = "g2c3"
        self.locked = 1 # this will create lock for adding constants 
my_const_grp2 = MY_CONST_GRP2()

print my_const_grp1.const1 # prints "g1c1" 
print my_const_grp1.const2 # prints "g1c2"
print my_const_grp2.const1 # prints "g2c1"
print my_const_grp2.const3 # prints "g2c3"
my_const_grp1.new_constant = "new value" #adding constants is allowed to this group
#my_const_grp1.const1 = "new value" #redefine would raise an error
#my_const_grp2.new_constant = "first value" #adding constant is also forbidden
#my_const_grp2.const1 = "new value" #redefine would raise an error

Voici un exemple similaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X