pylint除以零警告

pylint division by zero warning

有什么方法可以在 pylint 中启用 除零警告

"""
Oh my ...
"""
SOME_WRONG_GLOBAL = 0
NUMER = 7 / SOME_WRONG_GLOBAL

cpp 中的等效示例会发出适当的警告:

$ cat main.cpp
#define SOME_WRONG_MACRO 0
int main(int argc, char **argv)
{
    int NUMBER = 7/SOME_WRONG_MACRO;
    return 0;
}
$ g++ main.cpp -o main
main.cpp: In function ‘int main(int, char**)’:
main.cpp:4:19: warning: division by zero [-Wdiv-by-zero]
     int NUMBER = 7/SOME_WRONG_MACRO;

编辑 即使我添加 const-ness with:

from typing import Final
SOME_WRONG_GLOBAL: Final[int] = 0

我仍然没有收到 任何 pylint 警告(mypy 也没有)

pylint 使用的 astroid 底层 AST 表示非常强大,可以推断变量的值。

>>> from astroid import parse
>>> a = parse("""
 ... SOME_WRONG_GLOBAL = 0
 ... NUMER = 7 / SOME_WRONG_GLOBAL
 ... """)
>>> list(a.locals["NUMER"][0].infer())
[Uninferable]
>>>list(a.locals["SOME_WRONG_GLOBAL"][0].infer())[0].value
0

如果我们把SOME_WRONG_GLOBAL的值改成2,就可以看出list(a.locals["NUMER"][0].infer())[0].value的值是3.5

所以这并非不可能,但需要在 pylint 中进行新的检查,并且可能需要比来自 astroid 的 Uninferable 更明确的 return。 Uninferable 并不意味着代码中有错误,只是 astroid 无法判断该值是什么。