2011-08-16 77 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__])