Python中的常量:放在模块根部还是模块内的命名空间中?

61 投票
4 回答
68817 浏览
提问于 2025-04-16 11:59

我正在创建一个包含大约一百个常量的Python模块。

我想避免在别人导入我的模块时出现命名冲突,所以我在想有什么好的方法来解决这个问题。

MY_CONSTANT = 1
MY_SECOND_CONSTANT = 2
...
MY2_CONSTANT = "a"
MY2_SECOND_CONSTANT = "b"
...

或者

class My:
  CONSTANT = 1
  SECOND_CONSTANT = 2
  ...

class My2
  CONSTANT = "a"
  SECOND_CONSTANT = "b"
  ...

或者你们还有其他的建议吗?

我之前是用Java的,当然更喜欢第二种方式,但有些人可能觉得这样做有点过了……

4 个回答

21

来自PEP 8 – Python代码风格指南

常量

常量通常是在模块级别定义的,名字全部用大写字母,并且用下划线来分隔单词。比如说,MAX_OVERFLOWTOTAL就是常量的例子。

37

每个模块都有自己的命名空间,所以不需要再创建一个新的命名空间。

比如有一个模块叫 foo.py

FOO = 1
BAR = 2
SHMOO = 3

你可以这样使用它:

import foo
foo.BAR
46

这要看情况。一般来说,常量是在模块级别定义的。但是如果你有很多关于 category_acategory_b 的常量,可能可以考虑创建一个叫 constants 的子包,里面有 constants.category_aconstants.category_b 这样的模块。

我建议不要使用 class,因为它可以被实例化,这样就没什么意义了。而且它相比于模块没有什么优势,除了可以把多个类放在一个物理文件里(但如果常量很多的话,这样做可能不太好)。在Java中可能会用静态类,但在Python中,模块就是最合适的选择。

在Python中,名字冲突不是个大问题,除非你使用 import *(不过你本来就不应该这么做:根据文档的说法)。只要模块内部没有名字冲突,你可以放心,用户不会把你模块里的所有名字都拉到自己的模块里,也不会用一个和其他模块冲突的名字来导入你的模块。

撰写回答