【发布时间】: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