使用`除NameError:`来初始化变量

时间:2015-06-23 13:47:51

标签: python

在使用它们之前,通常("传统的")初始化某些类型的对象的方式对我来说似乎总是很尴尬。

作为一个简单的例子,我经常看到如下代码:

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,并且"肉"程序 - 任何阅读代码的人最有可能感兴趣的部分 - 首先出现。我认识到这些可能是完全主观的判断,所以最终这只是一个解释;讨论的这个方面与我的实际问题几乎没有关系。

我的实际问题是:是否存在任何客观原因(一般情况下(即没有特定的情境代码和运行速度测试),更喜欢一个而不是另一个?或者这纯粹是品味问题,和/或完全取决于实际情况?

1 个答案:

答案 0 :(得分:2)

我可以想到两种理由更喜欢“传统”的方式:

  1. 如果my_list恰好存在,您永远不会执行my_list = [FIRST]

  2. {li>

    NameErrortry区块中出现的原因除了您想要的原因之外的其他原因将会被遮盖,并且无法正确处理。