python中的常量分组
这主要是一个“好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
模块级的常数
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与vanillatuple
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只是想确认一下,您希望对象的唯一行为是持有这两个值并通过键和/或属性访问它们?