这主要是一个“好蟒蛇风格”的问题。
我有一个模块,它使用了许多感觉应该被分组的常量。
让我们说我们有狗和猫,每个人都有腿和最喜欢的食物。
请注意
我想到了以下解决方案:
模块级别的常量
DOG_NUMBER_OF_LEGS = 4
DOG_FAVOURITE_FOOD = ["Socks", "Meat"]
CAT_NUMBER_OF_LEGS = 4
CAT_FAVOURITE_FOOD = ["Lasagna", "Fish"]
他们似乎没有真正分组,但我认为这是我更喜欢的解决方案。
作为命名空间的类
class Dog(object):
NUMBER_OF_LEGS = 4
DOG_FAVOURITE_FOOD = ["Socks", "Meat"]
class Cat(object):
NUMBER_OF_LEGS = 4
FAVOURITE_FOOD = ["Lasagna", "Fish"]
我不喜欢这个解决方案,因为我们将使用不会使用的类,并且它们可以实际实例化。
常量字典
ANIMALS_CONFIG = {
"DOG" : {
"NUMBER_OF_LEGS" : 4,
"FAVOURITE_FOOD" : ["Socks", "Meat"]
},
"CAT" : {
"NUMBER_OF_LEGS" : 4,
"FAVOURITE_FOOD" : ["Lasagna", "Fish"]
}
}
我还想过添加子模块,但我真的不想暴露那些内部常量
最狡猾的方式是什么/你会怎么做?
答案 0 :(得分:6)
我会选择第四个选项,更喜欢collections.namedtuple
:
Animal = namedtuple('Animal', 'number_of_legs favourite_food')
然后创建如下的实例:
DOG = Animal(4, ['Socks', 'Meat'])
CAT = Animal(4, ['Lasagna', 'Fish'])
并从外部访问值:
from animals import CAT
print CAT.number_of_legs
如果你不需要创建任何方法,那么拥有类是没有意义的,我认为上面的访问形式比例如:。
from animals import animals
print animals['CAT']['number_of_legs']
与pilla namedtuple
s一样,{p> tuple
也是不可变的,所以你不能不小心重新分配,例如CAT.number_of_legs = 2
的某个地方。
最后,namedtuple
是一个轻量级的数据结构,如果您要创建大量动物,这可能很重要:
>>> import sys
>>> sys.getsizeof({'number_of_legs': 4, 'favourite_food': ['Lasagna', 'Fish']})
140
>>> from collections import namedtuple
>>> Animal = namedtuple('Animal', 'number_of_legs favourite_food')
>>> sys.getsizeof(Animal(4, ['Lasagna', 'Fish']))
36
答案 1 :(得分:4)
没有一个适合所有人的答案,它实际上取决于你必须处理多少常数,如何使用它们,是否有多态性调度是否有意义以及月亮的相位。
现在在您的示例中,由于您有两组或更多组具有相似结构和含义的常量,因此我将"类作为命名空间"解。
FWIW防止课堂实现并不困难:
>>> class Foo(object):
... def __new__(cls):
... return cls
...
>>> Foo()
<class '__main__.Foo'>
但是文档应该足够了 - 记住你的&#34;常数&#34;无论如何,它们只是常规的常量。
答案 2 :(得分:1)
我会选择字典方法,因为它感觉更具可读性和组织性,但我认为这是个人偏好的问题。
如果你使用只有静态变量和this之类的方法的类,并且你永远不会实例化它们,那么使用类似乎也不是一个坏主意。