在使用它们之前,通常("传统的")初始化某些类型的对象的方式对我来说似乎总是很尴尬。
作为一个简单的例子,我经常看到如下代码:
my_list = []
for _ in some_iterator:
# some complicated calculation for the NEXT list item
my_list.append(NEXT)
更糟糕的是,在许多情况下,后续项目取决于先前项目的值,或第一项:
FIRST = # some complicated multi-line calculation for FIRST list item
my_list = [FIRST]
for _ in some_iterator:
# code to skip the first item creation since it is already there
# some complicated calculation for the NEXT list item
my_list.append(NEXT)
为了避免这种情况,最近我一直在做以下几点:
for _ in some_iterator:
try:
# some complicated calculation for the NEXT list item
my_list.append(NEXT)
except NameError:
# come complicated calculation for FIRST list item
my_list = [FIRST]
进一步解释为什么我开始更喜欢第二种做事方式:似乎正在进行的任务 - 计算事物的my_list
- 应该被封装在它自己的代码块中,并且初始项目计算和/或以传统方式创建空列表似乎与EAFP不一致。使用第二种方法,假设存在my_list
,并且"肉"程序 - 任何阅读代码的人最有可能感兴趣的部分 - 首先出现。我认识到这些可能是完全主观的判断,所以最终这只是一个解释;讨论的这个方面与我的实际问题几乎没有关系。
我的实际问题是:是否存在任何客观原因(一般情况下(即没有特定的情境代码和运行速度测试),更喜欢一个而不是另一个?或者这纯粹是品味问题,和/或完全取决于实际情况?
答案 0 :(得分:2)
我可以想到两种理由更喜欢“传统”的方式:
如果my_list
恰好存在,您永远不会执行my_list = [FIRST]
。
NameError
在try
区块中出现的原因除了您想要的原因之外的其他原因将会被遮盖,并且无法正确处理。