2011-02-17 22 views
27

我正在構建一個大約有一百個常量的Python模塊。Python中的常量:在模塊的根部還是在模塊內部的命名空間中?

我想避免命名問題,當人們導入我的模塊,所以我想知道什麼是最好的方式來做到這一點。

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

或者

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

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

的另一個可能的建議或?

從Java的到來,我當然更喜歡第二種方法,但有些人可能會矯枉過正找到它...

+0

根據下面所選的答案,我也有我的模塊分割成`my.py`和`my2.py`,其它們中的每一個都有「CONSTANT」和「SECOND_CONSTANT」。 – 2011-02-17 10:29:53

+0

「位於模塊的根部還是位於模塊內的命名空間?」:是。 ;-) – 2011-02-17 10:48:28

回答

23

嗯,這取決於。通常,常量是在模塊級定義的。但是,如果您有許多常量爲category_acategory_b,則添加子模塊constants與模塊constants.category_aconstants.category_b甚至可能是有意義的。

我不會使用class - 它可能是實例化的,這是沒有意義的,除了允許您將多個物理文件夾入一個物理文件之外,它沒有優勢如果有這麼多常量的話)。 Java版本會使用靜態類,但是Python等價物是一個模塊。

名稱衝突不是Python中的問題,除非你在import * - but you shouldn't do that anyway。只要模塊內部沒有名稱衝突,請放心,用戶既不會將模塊中的所有名稱都拉出到自己的名稱中,也不會將其導入與另一個模塊衝突的名稱中。

10

style guide: 常數通常是在模塊級別定義,並用下劃線分隔寫入所有 大寫字母話。示例包括 MAX_OVERFLOW和TOTAL。

16

每個模塊都提供了自己的名稱空間,因此不需要創建另一個名稱空間。

有模塊foo.py

FOO = 1 
BAR = 2 
SHMOO = 3

你可以使用這樣的:

import foo 
foo.BAR
5

如果你使用類,你可以禁止覆蓋常量(或者甚至禁止向該類添加常量)。使用class over files(模塊)的好處還在於,當你有很多組時,你不需要擁有許多文件。

因此,這將是這樣的:

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 

Here is simillar example