类特定的“常量”是否仍应在模块级别声明?
在PEP 8中提到,“常量通常是在模块级别定义的……”。这对于标准库来说是有道理的,因为常量通常是和整个模块相关的,而不是某个特定的类(比如zlib.MAX_WBITS
或re.UNICODE
)。不过,我现在正在写一个模块,里面的常量都是和各个类相关的。
这个模块的设计是为了让Python程序能够处理一种特定应用的序列化格式,其中数据块被安排成“块”,而这些块又进一步被安排成“区域”。块和区域的尺寸是很有用的常量,我之前一直把它们作为类的属性来处理,直到我偶然看到PEP 8中的那句话。
我倾向于保持现在的做法(毕竟PEP 8也说过“愚蠢的一致性是小心眼的魔鬼”),但我想确保这样做不会让用户的期望受到太大的影响。(这个模块还没有发布,所以向后兼容性不是问题。)
作为参考,“PEP 8”风格……
CHUNK_SIZE_X = 16
CHUNK_SIZE_Z = 16
REGION_SIZE_X = 32
REGION_SIZE_Z = 32
def Chunk(object):
# magic happens here
def Region(object):
# magic happens here
……而我现在的“基于类”的风格……
def Chunk(object):
SIZE_X = 16
SIZE_Z = 16
# magic happens here
def Region(object):
SIZE_X = 32
SIZE_Z = 32
# magic happens here
2 个回答
0
谁在使用这个常量呢?你说“我现在正在写一个模块,不过这些常量都是和各个类有关的。”那就把常量放到对应的类里面吧。
14
很明显,类里面应该有类的常量。继续使用你的第二个例子吧。记住,PEP8并不是上天给我们的命令,它只是一些好的建议:传统、道理和经验可以影响这些建议的具体含义。
匈牙利命名法其实没必要。这也是你为什么要使用类的一个原因。