(我只是浪费了一些时间对同一个功能的两个不同版本进行编辑。)
冲突函数定义的一个小例子:
$> 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
答案 0 :(得分:1)
不,没有办法让Python以原生的方式行事。函数定义本质上是对名称的赋值,Python中的名称可以随时重新分配。与整数,字符串等相比,函数不会以任何特殊方式处理。
答案 1 :(得分:1)
您可以装饰所有功能并创建符号数据库并对重新定义发出警告。
答案 2 :(得分:0)
没有内置于该语言中,但您可以使用像pylint这样的代码检查工具(我相信还有其他工具),它们可以找到这些类型的东西并向您发出警告。