在python中分组常量

时间:2015-04-22 08:46:07

标签: python python-2.7 namespaces coding-style constants

这主要是一个“好蟒蛇风格”的问题。

我有一个模块,它使用了许多感觉应该被分组的常量。

让我们说我们有狗和猫,每个人都有腿和最喜欢的食物。

请注意

  1. 除了那些关于狗和猫的常数之外,我们只想建模。
  2. 很可能我们将来会有更多的动物。
  3. 这些常量不会在当前模块之外使用。
  4. 我想到了以下解决方案:


    模块级别的常量

    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"]
       }
    }
    

    我还想过添加子模块,但我真的不想暴露那些内部常量


    最狡猾的方式是什么/你会怎么做?

3 个答案:

答案 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之类的方法的类,并且你永远不会实例化它们,那么使用类似乎也不是一个坏主意。