Python语法错误:pyflakes只检测许多错误中的第一个错误

Python语法错误:pyflakes只检测许多错误中的第一个错误,python,vim,syntastic,pyflakes,Python,Vim,Syntastic,Pyflakes,假设我有以下代码: 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 -=

假设我有以下代码:

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本身只显示vim位置列表中的第一个错误…)


谢谢。

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


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

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


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

好的,但是如果我使用类似于
python-mpy\u compile test.py的东西,它也只会显示第一个可能的错误:
SyntaxError:('invalid syntax',('test.py',18,15,'def decr(d,a)\n')
。那么,有没有办法一次看到所有语法错误呢?当您运行python代码时,python解释器需要先编译它,然后才能执行任何操作。正如您所看到的,在出现第一个语法错误时,这将失败。如果您想同时查看所有语法,文本编辑器工具(如syntastic)非常适合。它们的工作方式是在编辑器中显示指示错误的图标。如果配置正确,您将在编写代码而不是执行代码时看到它们。这就是您在使用该工具时所寻找的吗?好的,但是如果我使用类似于
python-mpy\u compile test.py的东西,它也只会显示第一个可能的错误:
SyntaxError:('invalid syntax',('test.py',18,15,'def decr(d,a)\n')
。那么,有没有办法一次看到所有语法错误呢?当您运行python代码时,python解释器需要先编译它,然后才能执行任何操作。正如您所看到的,在出现第一个语法错误时,这将失败。如果您想同时查看所有语法,文本编辑器工具(如syntastic)非常适合。它们的工作方式是在编辑器中显示指示错误的图标。如果配置正确,您将在编写代码而不是执行代码时看到它们。这就是你在使用该工具时要寻找的吗?程序中给定行的语法有效性可能取决于它前面的行。由于这个原因,“所有可能的错误”并不像你认为的那样有意义。当编译器、linter等遇到语法错误时,它们需要返回到已知的良好状态,然后才能查找更多错误。这种复苏是一个众所周知(也是众所周知)的难题。对于某些语言,它有一个简单的解决方案;在绝大多数情况下,解决方案是未知的,或者根本不存在。这就是为什么有些编译器在第一次出错后就退出了编译。程序中给定行的语法有效性可能取决于它前面的行。由于这个原因,“所有可能的错误”并不像你认为的那样有意义。当编译器、linter等遇到语法错误时,它们需要返回到已知的良好状态,然后才能查找更多错误。这种复苏是一个众所周知(也是众所周知)的难题。对于某些语言,它有一个简单的解决方案;在绝大多数情况下,解决方案是未知的,或者根本不存在。这就是为什么有些编译器在出现第一个错误后干脆退出。