【问题标题】:Python syntax errors: pyflakes detects only the first error of manyPython 语法错误:pyflakes 只检测到许多错误中的第一个错误
【发布时间】:2016-02-19 17:36:00
【问题描述】:

假设我有以下代码:

def incr(d, a)
    r = {}
    for key, value in d.items():
        if key != a:
            value += 1
        r[key] = value
    return r
def decr(d, a)
    r = {}
    for key, value in d.items():
        if key == a:
            value -= 1
        r[key] = value
    retur r

可以看出,它在两个定义中都错过了:,并且在最后一行还包含retur 而不是return。但是,如果我通过 pyflakes(类似于pyflakes test.py)运行它,它只会报告所有错误中的第一个:

$ pyflakes test.py
test.py:9:15: invalid syntax
def incr(d, a)
              ^

一旦我修复了第一个,它就会在第二次运行时移动到下一个:

$ pyflakes test.py
test.py:18:15: invalid syntax
def decr(d, a)
              ^

所以,我的问题是我是否遗漏了什么,或者是否可以一次显示所有可能的错误?

(事实上,我正在尝试为 vim 使用syntastic 插件——但由于上述行为,syntastic 本身仅显示 vim 位置列表中的第一个错误...)

谢谢。

【问题讨论】:

  • (过程)程序中给定行的句法有效性取决于它之前的行。出于这个原因,“所有可能的错误”并不像您认为的那样有意义。当编译器、linter 等遇到语法错误时,它们需要回到已知的良好状态,然后才能查找更多错误。这种恢复是一个众所周知的(并且很好理解的)难题。对于某些语言,它有一个简单的解决方案;在绝大多数情况下,解决方案是未知的,或者不完全存在。这就是为什么一些编译器会在第一个错误之后简单地退出。

标签: python vim syntastic pyflakes


【解决方案1】:

Pyflakes 并非旨在检查语法错误。它是一种用于检查违反编码标准的错误的工具,由于代码仍然可以运行,因此可能无法检测到。例如,未使用的导入或变量。

语法错误是由 python 解释器抛出的,而不是 pyflakes 库。

【讨论】:

  • 好的,但是如果我使用python -m py_compile test.py 之类的东西,它也会只显示第一个可能的错误:SyntaxError: ('invalid syntax', ('test.py', 18, 15, 'def decr(d, a)\n'))。那么,有什么方法可以一次性查看所有的语法错误呢?
  • 当你运行 python 代码时,python 解释器需要编译它才能执行任何操作。如您所见,这将在第一个语法错误时失败。如果您想一次查看所有语法,文本编辑器工具(例如 syntastic)非常适合。他们的工作方式是在编辑器中显示指示错误的图标。如果配置正确,您将在编写代码时看到它们,而不是执行它。这就是您使用该工具时要寻找的东西吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多