首页 > 解决方案 > 当一条语句中有两个不同的错误时,Python 如何决定显示哪一个?

问题描述

当我们在解释器中输入以下内容时:

10(b)

我们得到一个未定义 b 的 NameError。但是,当我们尝试:

10(4)

现在,我们得到了 int 不可调用的错误信息。为什么 Python 在上面的第一种情况下没有给出相同的错误,因为即使在那里, int 也是不可调用的?换句话说,在第一个片段中,我们同时遇到了“int not callable”和“NameError”的错误。如果 Python 从左到右扫描,它首先会看到在 int (10) 上执行的调用操作。所以它也应该给第一个错误“int not callable”。为什么没有呢?

我认为这可能是因为它首先评估括号内的表达式。但是,当我们尝试这样做时:

f(print("Hello"))

现在,它说 NameError 没有定义 f。它甚至不打印“你好”。所以这表明我们对括号表达式求值的假设似乎不成立。

那么它究竟是如何工作的呢?

标签: python-3.x

解决方案


您只是在执行具有运行时错误的有效表达式。代码按照规定的求值顺序执行,运算符根据它们的优先级执行。在每个表达式中,您需要检查该特定操作的文档,以了解操作各部分的执行顺序。

在所有三种情况下,您都要求 Python 执行call,其中记录了规则:

主节点必须评估为可调用对象[.] 在尝试调用之前评估所有参数表达式。

可调用对象首先被评估为对象,并10成功执行以生成对象。在评估参数表达式之前,不会尝试调用。

参数表达式是构成要传递给调用的值的表达式,即(...). 只有在评估了这些表达式后,才会进行调用。

您的第一个示例给出了一个NameError异常,因为b表达式评估失败。由于参数表达式的评估失败,Python 从未执行过调用。

在您的第二个示例中,参数表达式是4,一个成功的有效表达式,因此只有这样 Python 才能继续执行调用。但是10是不可调用的,所以那是下一个失败。

最后一个示例在表达式的开头就失败了f,因为 Python 首先评估了可调用部分,但由于未定义名称而无法加载可调用部分。

对于其他操作员适用不同的评估顺序规则,您必须查看该特定操作员的文档,以查看组件部分的执行顺序。


推荐阅读