我遇到的情况是模块需要做一些简单但稍微耗时的初始化。其中一个结束条件是一对列表,它们将由初始化填写;让我烦恼的是,列表的作用 - 基本上是常量 - 和实际初始化它们的需要之间存在冲突。
我写这样的代码感到不安:
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模式?
答案 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