【问题标题】:How to quickly figure out which list is causing the error?如何快速找出导致错误的列表?
【发布时间】:2022-01-03 02:09:30
【问题描述】:

在python脚本中,如果我们在一个表达式中有多个列表,例如:

a[1] = b[2] + c[3] + d[4]

a[1] = b[c[d[1]]] # (This case added in EDIT)

现在,这些列表之一会引发错误 IndexError: List Index Out of Range ,因为索引高于列表长度。

有没有办法使用try/except 语句来改进这种默认异常处理,以便我们可以立即找出导致问题的列表?

否则,需要使用命令行调试器检查每个列表。我了解,如果 IDE 可用,那么此功能可能已内置在 IDE 中。

【问题讨论】:

  • 不太可能,因为 python 不会告诉您该行的哪一部分导致了错误。您可以尝试在 except 子句中单独访问每个列表中的元素,这会引发另一个错误,但这不是很可扩展
  • 如果您关心哪个列表引发了异常,您应该在单独的try 语句中为每个列表编制索引,以便明确涉及哪个列表。

标签: python list exception


【解决方案1】:

另一种选择是使用inspect 模块来查找引发错误的行号。这需要您修改添加的 + 分配以使用先前定义的本地变量,例如 bv = b[2],或者将其拆分为单独的行,如图所示。

a = [1, 2, 3]
b = [1] * 3
c = [2] * 3
d = [3] * 5

try:
    a[1] = b[2] + \
           c[3] + \
           d[4]

except IndexError:
    from inspect import trace
    var = trace()[0].code_context[0].split('=', 1)[-1].split('[', 1)[0].lstrip(' +-*')
    print(f'The variable that raised the IndexError was: {var}')

输出:

The variable that raised the IndexError was: c

有趣的事实: 以下语法,我实际上认为是良好的编码实践,实际上 not 表现得像你想要的信息堆栈跟踪。不幸的是,我不知道为什么。

    a[1] = b[2] \
           + c[3] \
           + d[4]

【讨论】:

    【解决方案2】:

    最简单的方法是人为地将行拆分为几行。例如:

    b =[1]
    c = []
    d = [1]
    
    a = b[0] + \
        c[0] + \
        d[0]
    
    Traceback (most recent call last):  
        File "/tmp/foo.py", line 7, in <module>
        c[0] + \
    IndexError: list index out of range
    

    【讨论】:

    • 不幸的是,如果您声明带有前导 + 的行,例如,这将不起作用。比如+ c[0] \ 。我不知道这是为什么,tbh。
    • 是的!我认为这可能是一个可行的解决方法;但通常也可以有嵌套项,例如a[b[c[0]]]
    • 与 `\` 相同的技巧可以通过嵌套变量来完成。
    • @match 知道了!如果可行,我将对其进行测试并接受答案;但是有没有一种工具可以在每个变量之后自动拆分它,这很酷,手动操作是不可扩展的
    • @match 您能否在黑色自动格式化程序上添加一行。我用黑色代码格式化程序进行了测试。 black -l 1 file.py 其中1 是每行的字符数,使您的答案可扩展。我试图编辑你的答案,但现在编辑队列已满,明天再试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2021-08-12
    • 2022-01-03
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多