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 无法判断该值是什么。
有什么方法可以在 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 无法判断该值是什么。