首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让python“排除”块中的每一行代码,而不是将其作为一个整体?

如何让python“排除”块中的每一行代码,而不是将其作为一个整体?
EN

Stack Overflow用户
提问于 2018-05-31 09:09:13
回答 1查看 27关注 0票数 -1

我一直在编写一些python代码,处理列表以创建一个矩阵,并且一直在研究一种填充元素和那些元素周围的值的方法。我遇到了“索引超出范围的错误”,就好像我循环遍历每个元素并到达矩阵的远端,然后尝试进一步添加,它就会从列表中掉出来。尽管这是一种糟糕的做法,但我还是决定使用"try...except..pass“方法,使我的代码看起来像这样:https://i.stack.imgur.com/fMYCF.png

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 09:17:20

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

例如,您有一堆如下所示的代码行:

代码语言:javascript
复制
self.w[i0-1][j0+1] += 3

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

代码语言:javascript
复制
def _inc(self, i, j, diff):
    try:
        self.w[i][j] += diff
    except:
        pass

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

代码语言:javascript
复制
self._inc(i0-1, j0+1, 3)

…它会做你想做的:递增所有不会引发异常的东西,当它引发异常时什么也不做。

但是,既然我们这样做了,您可能不希望这里有一个空的except。相反,您只想防范您所期望的特定异常。很可能是一个IndexError

包装器函数的好处是我们只需要在一个地方而不是78个地方改变东西:

代码语言:javascript
复制
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,它将递增最后一行的…)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50615293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档