2011-08-16 41 views
11

创建常量我写这需要找出一个数据库的模式,整个引擎的应用程序。为此,我正在使用Python编写一个小型数据库适配器。我决定首先编写一个概述我需要的功能的基类,然后使用从此基类继承的类来实现它。一路上,我需要实现一些需要在所有这些类中都可访问的常量。其中一些常量需要使用C型按位或组合。公约关于Python

我的问题是,

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

对于前者,我遇到了所有常量首先放入模块的线程。对于后者,我简要考虑了使用布尔语的字典。这两个看起来都太不实用了。我想这是一个相当普遍的要求,并且认为确实存在一些好方法!

回答

3

你经常会发现在全球范围内的常数,他们是存在那里的几个变量之一。也有使用类型的字典或物体像这样

class Const: 
    x = 33 

Const.x 

谁写恒的命名空间有一些人谁把他们在模块和其他人将它们作为类变量实例访问的人。大多数情况下,它的个人品味,但只有少数全球变量不会真的伤害那么多。

14

什么是分享这样的常量标准的方式?

在整个标准库中,最常见的方法是使用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 
# ... 

有些人喜欢一个更可读的风格,计算常量使用动态移位运算符:

OPTION_A = 1 << 0 
OPTION_B = 1 << 1 
OPTION_C = 1 << 2 
# ... 

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

OPTION_A = 0b00000001 
OPTION_B = 0b00000010 
OPTION_C = 0b00000100 
OPTION_D = 0b00001000 

B因为这个符号很长并且很难阅读,所以使用十六进制或二进制移位符号可能更可取。

11

常数通常走在模块级。从PEP 8

常量

常数通常是在模块级别定义,并写在用下划线分隔单词全部大写字母。例子包括MAX_OVERFLOW和TOTAL。

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

3

Stdlib是你要能在doctestcode发现哪些知识例子的重要来源:

OPTIONS = {} 

# A function to add (register) an option. 
def register_option(name): 
    return OPTIONS.setdefault(name, 1 << len(OPTIONS)) 

# A function to test if an option exist. 
def has_option(options, name): 
    return bool(options & name) 

# All my option defined here. 
FOO = register_option('FOO') 
BAR = register_option('BAR') 
FOOBAR = register_option('FOOBAR') 


# Test if an option figure out in `ARG`. 
ARG = FOO | BAR 
print has_option(ARG, FOO) 
# True 
print has_option(ARG, BAR) 
# True 
print has_option(ARG, FOOBAR) 
# False 

N.B:re模块也采用逐位参数风格也一样,如果你想另一个例子。

2

命名通常是UPPERCASE_WITH_UNDERSCORE,它们通常是模块级别的,但偶尔它们会生活在自己的班级中。一个很好的理由在一类是当值特殊 - 比如需要是两个大国:

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__])