在Python中创建常量的约定

sus*_*its 17 python coding-style

我正在编写一个应用程序,需要跨引擎找出数据库的模式.为此,我正在使用Python编写一个小型数据库适配器.我决定首先编写一个基类来概述我需要的功能,然后使用从这个基础继承的类来实现它.在此过程中,我需要实现一些需要在所有这些类中可访问的常量.其中一些常量需要使用C风格的按位OR组合.

我的问题是,

  1. 分享这些常量的标准方法是什么?
  2. 什么是创建可以组合的常量的正确方法?我指的MAP_FIXED | MAP_FILE | MAP_SHARED是C允许的样式代码.

对于前者,我遇到了线程,其中所有常量首先被放入模块中.对于后者,我简要地想到使用布尔词典.这两个似乎都太笨拙了.我想这是一个相当普遍的要求,并且认为必须确实存在一些好方法!

Fer*_*yer 17

分享这些常量的标准方法是什么?

在整个标准库中,最常用的方法是使用UPPER_CASE_WITH_UNDERSCORES名称将常量定义为模块级变量.

什么是创建可以组合的常量的正确方法?我指的是MAP_FIXED | MAP_FILE | C允许的MAP_SHARED样式代码.

适用与C相同的规则.您必须确保每个常量值对应一个唯一的位,即2的幂(2,4,8,16,...).

大多数时候,人们使用十六进制数字:

OPTION_A = 0x01
OPTION_B = 0x02
OPTION_C = 0x04
OPTION_D = 0x08
OPTION_E = 0x10
# ...
Run Code Online (Sandbox Code Playgroud)

有些人更喜欢更人性化的风格,使用移位运算符动态计算常量值:

OPTION_A = 1 << 0
OPTION_B = 1 << 1
OPTION_C = 1 << 2
# ...
Run Code Online (Sandbox Code Playgroud)

在Python中,您还可以使用二进制表示法使其更加明显:

OPTION_A = 0b00000001
OPTION_B = 0b00000010
OPTION_C = 0b00000100
OPTION_D = 0b00001000
Run Code Online (Sandbox Code Playgroud)

但由于这种表示法很冗长且难以阅读,因此使用十六进制或二进制移位表示法可能更可取.


Mik*_*one 15

常量通常在模块级别进行.从PEP 8:

常量

常量通常在模块级别定义,并以全部大写字母书写,下划线分隔单词.示例包括MAX_OVERFLOW和TOTAL.

如果需要类级别的常量,请将它们定义为类属性.


Jak*_*yer 3

您经常会在全局级别找到常量,它们是存在的少数变量之一。还有人使用字典或对象编写常量名称空间,如下所示

class Const:
    x = 33

Const.x
Run Code Online (Sandbox Code Playgroud)

有些人将它们放入模块中,而另一些人将它们附加为实例访问的类变量。大多数时候这是个人喜好,但仅仅几个全局变量并不会真正造成那么大的伤害。