为什么python只打印一条错误消息?

2024-09-21 04:43:51 发布

您现在位置:Python中文网/ 问答频道 /正文

很多我知道的语言(比如C++、C、RIST等)一次打印多个错误消息。那么为什么python只打印一条错误消息呢


Tags: 语言消息错误rist
3条回答

很难回答确切的原因。我无法了解C-python、jython、pypy或其他开发人员的头脑

许多错误只能在运行时看到,因为python是一种解释语言,没有严格的类型

但是,如果没有语法错误,每个文件都会编译成字节码

因此,对于语法错误,我无法给出原因,因为这在技术上是可能的。然而,我从来没有遇到过这个问题,因为我使用像pylintflake8这样的工具来检查代码

这些工具可以检测多个错误,并给出许多关于编码风格的警告

因此,我无法告诉您原因,但只能告诉您如何一次性获得多个错误

这些工具可以配置为只显示某些类型的错误

要安装一个或另一个工具,只需键入: pip install flake8pip install pylint

然后在所有代码所在的目录中键入flake8pylint 或者键入flake8 <filename>pylint <filename>只检查一个文件

请注意,许多IDE(如Microsoft Visual Studio Code、Pycharm等)可以配置为自动为您运行这些工具,并在您执行代码之前发出任何问题的信号

首先,我假设我们讨论的是语法错误,即编译器可以(也应该)检测和报告的语法错误

这主要是一种设计选择。Python基本上是基于这样一个概念构建的,即一切都应该在运行时完成。而且编译器故意保持尽可能简单

简单易懂,或复杂复杂: 简单地说,您可以选择使用易于理解和维护的非常简单的编译器,或者使用具有复杂程序分析和优化的复杂机器

语言如C、C++、Rand在编译过程中从强优化代码中汲取力量,因此采用了高度复杂和极其复杂的编译器的第二条路线。处理语法错误是他们不那么令人印象深刻的壮举之一

另一方面,Python走了另一条路。事实上,一般来说,Python编译器在不实际运行Python代码的情况下是不可能预测一段Python代码到底在做什么的,这首先排除了所有有趣的优化机会,因此,一个复杂的编译器无论如何都没有意义。因此,保持Python编译器的简单并关注运行时优化是正确的选择。但它的缺点是编译器在发现错误时会直接退出


给我一点背景

一,。错误恢复

在编译器中处理错误并从语法错误中恢复是很困难的

编译器通常非常擅长将(语法上)正确的程序快速高效地翻译成代表原始程序的机器代码。但是,如果出现语法错误,编译器通常无法猜测程序员的原始意图,因此不清楚如何处理错误代码

下面是一个非常简单的例子:

pen color("red")

显然,这里有一些错误,但如果没有进一步的上下文,就不可能判断这一行的初衷是pen = color("red")pencolor("red")pen.color("red")还是完全其他什么

如果编译器想继续查看程序的其余部分(从而发现潜在的更多语法错误),它需要一个如何处理这种情况并恢复的框架,以便继续:它需要一个错误恢复策略。这可能像跳过整行或单个令牌一样简单,但没有明确的“正确”解决方案

二,。Python的编译器

Python一次编译一个符号

Python当前的编译器一次只查看一个符号(称为LL(1)编译器)。这使得为Python自动构建编译器变得非常简单,而且非常快速高效。但这意味着,在某些情况下,尽管出现了“明显的”语法错误,Python仍会愉快地继续编译程序,直到程序真正丢失为止

看看这个例子:

x = foo(
y = bar()
if x > y:

作为人类,我们很快就能看到第1行中缺少的右括号。但是,从编译器的角度来看,这看起来更像是一个带有命名参数的调用,类似于:

x = foo(y = bar() if x > y else 0)

因此,Python只会在第3行中的冒号处注意到有问题,冒号是第一个与其“假设”不符的符号。但在这一点上,很难弄清楚如何处理这段代码,以及如何正确地恢复:在这种情况下,是否跳过冒号?或者你应该回到过去,在更早的时候纠正一些事情,如果是这样的话,你要走多远

三,。跟进错误

错误恢复会产生“重影”错误

在上面的第一个示例中,编译器可以跳过整条线,毫无问题地继续前进。但在某些情况下,如何从语法错误中恢复的选择(可能)会影响下面的一切,如本例所示:

deffoo(x):

这背后的意图可能是def foo(x):,也可能只是一个调用deffoo(x)。但是这种区别决定了编译器将如何查看后面的代码,或者报告缩进错误,或者可能报告函数外部的return,等等

错误恢复的危险在于编译器的猜测可能实际上是错误的,这可能导致一系列报告的后续错误,这些错误甚至可能不是真正的错误,而是由编译器的错误决定造成的幽灵


底线:要正确地进行错误恢复和错误报告非常困难。因此,Python选择只报告它遇到的第一个语法错误是明智的,对大多数用户和情况都适用

实际上,我已经编写了一个parser with more sophisticated error detection,它可以列出它在Python程序中发现的所有错误。但根据我的经验,除了第一个错误之外,还有太多的额外错误都是垃圾,因此我总是坚持只显示程序中的第一个错误

C或C++是使用编译器编译然后执行的,但是Python是一种解释语言,它意味着解释器读取每一行,然后执行它,当解释器看到程序中的错误时,它停止并用JS等其他解释语言显示错误。 我希望你的问题得到解决,但如果你想阅读更多,你可以在谷歌上搜索“解释和编译语言”或查看this

相关问题 更多 >

    热门问题