为多重定义的函数寻求python警告

时间:2016-05-20 22:22:54

标签: python pylint

问:有没有办法让Python在有同一个函数的多个定义,冲突等时给我一个警告。

(我只是浪费了一些时间对同一个功能的两个不同版本进行编辑。)

冲突函数定义的一个小例子:

$>  cat ./foo2.py
cat ./foo2.py
def foo():
    print "1st definition of foo()"
def foo():
    print "2nd definition of foo()"
foo()

执行 - Python使用最后一个定义。 (顺便说一句,这是正式定义的吗?它是有用的语义,例如在字符串中动态创建函数并对其进行评估时。它在解释器中很有用。但它在某些情况下掩盖了错误,因此我希望有一个可选的警告。)

$>  python ./foo2.py
python ./foo2.py
2nd definition of foo()

“python -W all”没有发出警告:

$>  python -W all ./foo2.py
python -W all ./foo2.py
2nd definition of foo()

也没有“使用警告”。

就此而言,python3与上面相同(虽然python3需要围绕参数的parens打印:-()。

pylint DOES报告错误

E:  4, 0: function already defined line 2 (function-redefined)

但是我一直反对单独的lint工具,这些工具对于熟悉编程语言历史的人来说应该是众所周知的。 (例如lint很吵; lint是可选的,并不总是运行; lint是可选的,例如没有用python自动安装,并且要求我做一些hacks来安装(自制问题?) - 我几乎放弃了,如果我放弃了我不会有pylint。)

因此,即使pylint确实发现错误,我仍然会问:

问:有没有办法让python本身报告多重定义函数的错误或警告?

===

相比之下,并回应那些说“你为什么要用动态语言做到这一点?”的人?

Perl也是一种动态语言。当Perl第一次出现时,它没有这样的警告。但现在确实如此,因为人们意识到这样的警告对代码质量有好处。

默认情况下,Perl不会警告多个定义,但会使用-Wall警告或使用警告。

$>  cat foo2.pl
cat foo2.pl
sub foo { print "foo#1" }
sub foo { print "foo#2" }
foo()

$>  perl -Wall ./foo2.pl
perl -Wall ./foo2.pl
Subroutine foo redefined at ./foo2.pl line 2.
foo

3 个答案:

答案 0 :(得分:1)

不,没有办法让Python以原生的方式行事。函数定义本质上是对名称的赋值,Python中的名称可以随时重新分配。与整数,字符串等相比,函数不会以任何特殊方式处理。

答案 1 :(得分:1)

您可以装饰所有功能并创建符号数据库并对重新定义发出警告。

答案 2 :(得分:0)

没有内置于该语言中,但您可以使用像pylint这样的代码检查工具(我相信还有其他工具),它们可以找到这些类型的东西并向您发出警告。