python中的常量分组

python中的常量分组,python,python-2.7,namespaces,coding-style,constants,Python,Python 2.7,Namespaces,Coding Style,Constants,这主要是一个“好python风格”的问题 我有一个模块,它使用了一些常量,感觉应该分组 假设我们有狗和猫,它们都有很多腿和最喜欢的食物 注意 我们只想对猫和狗的常数进行建模 很可能将来我们会有更多的动物 这些常数不会在当前模块之外使用 我考虑了以下解决方案: 模块级的常数 DOG_NUMBER_OF_LEGS = 4 DOG_FAVOURITE_FOOD = ["Socks", "Meat"] CAT_NUMBER_OF_LEGS = 4 CAT_FAVOURITE_FOOD = ["Lasa

这主要是一个“好python风格”的问题

我有一个模块,它使用了一些常量,感觉应该分组

假设我们有狗和猫,它们都有很多腿和最喜欢的食物

注意

  • 我们只想对猫和狗的常数进行建模
  • 很可能将来我们会有更多的动物
  • 这些常数不会在当前模块之外使用
  • 我考虑了以下解决方案:


    模块级的常数

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

    我也考虑过添加子模块,但我真的不想公开那些内部常量

    ANIMALS_CONFIG = { 
       "DOG" : { 
         "NUMBER_OF_LEGS" : 4,
         "FAVOURITE_FOOD" : ["Socks", "Meat"]
       },
       "CAT" : { 
         "NUMBER_OF_LEGS" : 4,
         "FAVOURITE_FOOD" : ["Lasagna", "Fish"]
       }
    }
    


    什么是最具Python风格的方法/你会怎么做?

    我会选择字典法,因为它更具可读性和组织性,但我相信这是个人偏好的问题


    如果你使用一个只包含静态变量和方法的类,比如,而你从不实例化它们,那么使用类似乎也不是一个坏主意。

    没有一个万能的答案,这实际上取决于你必须处理多少常量,如何使用它们,是否有意义,以及月亮的相位

    现在在您的示例中,由于您有两组或更多具有相似结构和含义的常量,因此我选择“类作为名称空间”解决方案

    FWIW防止类实例化并不是那么困难:

    >>> class Foo(object):
    ...    def __new__(cls):
    ...       return cls
    ... 
    >>> Foo()
    <class '__main__.Foo'>
    
    >>类Foo(对象):
    ...    定义新的(cls):
    ...       返回cls
    ... 
    >>>Foo()
    

    但是文档应该足够了——记住,您的“常量”只是约定的常量。

    我会选择第四个选项,更喜欢:

    然后创建如下实例:

    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']
    
    namedtuple
    s与vanilla
    tuple
    s一样,也是不可变的,因此您不能意外地重新分配,例如
    CAT.number\u 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
    

    你也可以有一个类
    Animal
    ,包含该类的
    dog
    cat
    实例。或者你也可以使用。你将如何在代码中使用它们?您是迭代还是选择?选择参数从何而来?没有迭代或类似的东西。只是用全名调用我的常量。狗腿数、动物配置[“狗”][“狗腿数”]或狗腿数_LEGS@MarioA.CorcheroJiménez只是想确认一下,您希望对象的唯一行为是持有这两个值并通过键和/或属性访问它们?