如何让python"排除"块中的每一行代码,而不是整个代码?



我一直在研究一些python代码,并弄乱列表以创建一个矩阵,并一直在研究一种用值填充元素和围绕这些元素的方法。我遇到了"索引超出范围错误",就好像我遍历每个元素并到达矩阵的远端,并尝试进一步添加,它就落在列表中。尽管这是不好的做法,但我还是决定使用"尝试...除了。。pass"方法,使我的代码如下所示: https://i.stack.imgur.com/fMYCF.png

但是,问题是,一旦它传递了一个错误,它就会直接返回到循环的开始,并且无法将剩余的值添加到周围的元素中。有没有办法让"try"命令单独应用于每个命令,还是必须单独应用于每一行?

在这种情况下,您通常想要的是一个包装函数。

例如,你有一堆看起来像这样的行:

self.w[i0-1][j0+1] += 3

从一行到下一行的唯一区别是两个索引和增量值。因此,让我们编写一个将这三件事作为参数的方法:

def _inc(self, i, j, diff):
try:
self.w[i][j] += diff
except:
pass

现在,这些行中的每一行都可以更改为:

self._inc(i0-1, j0+1, 3)

。它会做你想做的事:增加所有不会引发异常的东西,当它发生时什么都不做。

但是,当我们在这里时,您可能不希望在这里出现裸露的except。相反,您希望仅防范预期的特定异常。这可能是一个IndexError.

包装函数的好处是,我们只需要在一个地方而不是 78 个地方更改内容:

def _inc(self, i, j, diff):
try:
self.w[i][j] += diff
except IndexError:
pass

同样,如果你想改变一些东西,所以每次有异常时它都会调用log.debug,你只需替换那个pass

或者,如果您想预先检查或后检查该0 <= i < len(self.w) and 0 <= j < len(self.w[i]).(你可能想要这个——请注意,如果self.w是一个列表列表,当i0为 0 时,i0-1-1,这不会引发IndexError,它会增加最后一行......

最新更新