在Python中初始化模块级列表的最简单方法

时间:2014-02-25 06:38:26

标签: python module styles

我遇到的情况是模块需要做一些简单但稍微耗时的初始化。其中一个结束条件是一对列表,它们将由初始化填写;让我烦恼的是,列表的作用 - 基本上是常量 - 和实际初始化它们的需要之间存在冲突。

我写这样的代码感到不安:

 CONSTANT_LIST = []
 DIFFERENT_LIST = []

 for item in get_some_data_slowly():
      if meets_criteria_one(item): 
         CONSTANT_LIST.append(item)
         continue
      if meets_criteria_two(item):
         DIFFERENT_LIST.append(item)

由于临时读者会看到这些列表通常被常量占据,并且可能期望它们是空的。

OTOH,如果我能把这个作为列表理解来写,我会对同样的幕后事实感到满意:

 CONSTANT_LIST = [i for i in some_data() if criterion(i)]

等等......除了我需要从相同(稍微耗时)的源中绘制两个列表,因此两个列表推导会使代码明显变慢。

更糟糕的是,应用程序将常量隐藏在方法之后:

__private_const_list = None
__other_private_list = None

def public_constant_list():
    if __private_const_list: return  __private_const_list 
    # or do the slow thing now and fill out both lists...
    # etc

def public_other_const_list():
    # same thing

有点愚蠢,因为每次会话的可能使用频率基本上是1。

正如你所看到的那样,这不是一个火箭科学问题,但我的Python感觉根本没有刺痛。什么是合适的pythonic模式?

1 个答案:

答案 0 :(得分:1)

循环很清楚。不要因为太聪明而混淆它。只需使用注释来帮助解释

CONSTANT_LIST = []    # Put a comment here to tell the reader that these 
DIFFERENT_LIST = []   # are constants that are filled in elsewhere
"""
Here is an example of what CONSTANT_LIST looks like
...
Here is an example of what DIFFERENT_LIST looks like
...
"""


for item in get_some_data_slowly():
    if meets_criteria_one(item): 
        CONSTANT_LIST.append(item)
    elif meets_criteria_two(item):
        DIFFERENT_LIST.append(item)

也许使用elif代替continue/if