python-3.x - 当一条语句中有两个不同的错误时,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 执行call,其中记录了规则:
主节点必须评估为可调用对象[.] 在尝试调用之前评估所有参数表达式。
可调用对象首先被评估为对象,并10
成功执行以生成对象。在评估参数表达式之前,不会尝试调用。
参数表达式是构成要传递给调用的值的表达式,即(...)
. 只有在评估了这些表达式后,才会进行调用。
您的第一个示例给出了一个NameError
异常,因为b
表达式评估失败。由于参数表达式的评估失败,Python 从未执行过调用。
在您的第二个示例中,参数表达式是4
,一个成功的有效表达式,因此只有这样 Python 才能继续执行调用。但是10
是不可调用的,所以那是下一个失败。
最后一个示例在表达式的开头就失败了f
,因为 Python 首先评估了可调用部分,但由于未定义名称而无法加载可调用部分。
对于其他操作员适用不同的评估顺序规则,您必须查看该特定操作员的文档,以查看组件部分的执行顺序。
推荐阅读
- c# - 如何按字母顺序对列表进行排序
在 C# 中? - java - 我想每 X 秒执行一次代码,但 handler.postDelayed 不起作用
- c++ - 单独初始化类的静态数组元素
- angular - 我正在使用 ios 安装 angular cli 时出现错误
- javascript - 控制台不会从 ATOM 运行我的 Javascript 代码?**初学者
- android - 我的 appcompat 版本有问题
- swift - 为什么结构在 Swift 中没有像类一样的反初始化器?
- hadoop - 如何更改hadoop中的超级组?
- powershell - 使用 powershell 从 sccm 客户端获取软件中心更新安装状态
- javascript - 使用 lodash 将键/值对转换为对象