类特定的“常量”是否仍应在模块级别声明?

11 投票
2 回答
3643 浏览
提问于 2025-04-16 12:25

PEP 8中提到,“常量通常是在模块级别定义的……”。这对于标准库来说是有道理的,因为常量通常是和整个模块相关的,而不是某个特定的类(比如zlib.MAX_WBITSre.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并不是上天给我们的命令,它只是一些好的建议:传统、道理和经验可以影响这些建议的具体含义。

匈牙利命名法其实没必要。这也是你为什么要使用类的一个原因。

撰写回答