Coding style 关于在Python中创建常量的约定
我正在编写一个应用程序,它需要跨引擎找出数据库的模式。为此,我正在使用Python编写一个小型数据库适配器。我决定首先编写一个基类,概述我需要的功能,然后使用从该基类继承的类实现它。在此过程中,我需要实现一些常量,这些常量需要在所有这些类中都可以访问。其中一些常量需要使用C样式的按位OR组合 我的问题是,Coding style 关于在Python中创建常量的约定,coding-style,python,Coding Style,Python,我正在编写一个应用程序,它需要跨引擎找出数据库的模式。为此,我正在使用Python编写一个小型数据库适配器。我决定首先编写一个基类,概述我需要的功能,然后使用从该基类继承的类实现它。在此过程中,我需要实现一些常量,这些常量需要在所有这些类中都可以访问。其中一些常量需要使用C样式的按位OR组合 我的问题是, 共享这些常量的标准方式是什么 创建可以组合的常量的正确方法是什么?我指的是C允许的MAP|u FIXED | MAP|u FILE | MAP|u SHAREDstyle代码 对于前者,我遇到
MAP|u FIXED | MAP|u FILE | MAP|u SHARED
style代码对于前者,我遇到了线程,其中所有常量都首先放在一个模块中。对于后者,我简短地考虑过使用布尔语。这两个似乎都太笨拙了。我想这是一个相当普遍的要求,并且认为一定存在一些好的方法 您经常可以在全局级别找到常量,它们是存在于全局级别的少数变量之一。也有人使用dict或类似这样的对象编写常量名称空间
class Const:
x = 33
Const.x
有些人将它们放在模块中,有些人将它们作为类变量附加到实例访问中。大多数情况下,它的个人品味,但仅仅几个全球变量并不会真的伤害那么大
共享这些常量的标准方式是什么
在整个标准库中,最常见的方法是使用大写字母和下划线名称将常量定义为模块级变量
创建可以组合的常量的正确方法是什么?我指的是C允许的MAP|U固定的| MAP|U文件| MAP|U共享样式代码
与C中相同的规则适用。必须确保每个常量值对应一个唯一的位,即2(2,4,8,16,…)的幂
大多数情况下,人们使用十六进制数来表示:
OPTION_A = 0x01
OPTION_B = 0x02
OPTION_C = 0x04
OPTION_D = 0x08
OPTION_E = 0x10
# ...
有些人更喜欢更具可读性的样式,即使用shift运算符动态计算常量值:
OPTION_A = 1 << 0
OPTION_B = 1 << 1
OPTION_C = 1 << 2
# ...
但由于该符号冗长且难以阅读,使用十六进制或二进制移位符号可能更可取。常量通常位于模块级别。发件人: 常数 常量通常在模块级别定义,并用所有大写字母书写,用下划线分隔单词。示例包括最大溢出和总计 如果您想要类级别的常量,请将它们定义为类属性。是一个很好的知识来源,您可以在以下内容中找到所需的示例:
OPTIONS={}
#添加(注册)选项的函数。
def寄存器_选项(名称):
return OPTIONS.setdefault(name,1命名通常是大写字母,带下划线,通常是模块级的,但偶尔也存在于自己的类中。当值是特殊值时,比如需要是二的幂时,就可以进入类中
class PowTwoConstants(object):
def __init__(self, items):
self.names = items
enum = 1
for name in items:
setattr(self, name, enum)
enum <<= 1
constants = PowTwoConstants('ignore_case multiline newline'.split())
print constants.newline # prints 4
然后
import sys
constants.export(sys.modules[__name__])
class PowTwoConstants(object):
def __init__(self, items):
self.names = items
enum = 1
for name in items:
setattr(self, name, enum)
enum <<= 1
constants = PowTwoConstants('ignore_case multiline newline'.split())
print constants.newline # prints 4
def export(self, namespace):
for name in self.names:
setattr(namespace, name, getattr(self, name))
import sys
constants.export(sys.modules[__name__])