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

Seek python warning for a multiply defined function

问:有没有办法让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()

"use warnings".

也没有

就此而言,python3 与上述相同(尽管 python3 需要在参数周围加上括号以打印 :-( )。

pylint 确实报告错误

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

但我通常反对将任何熟悉编程语言历史的人都应该熟知的 lint 工具分开。 (例如,lint 很嘈杂;lint 是可选的,并不总是 运行;lint 是可选的,例如,没有使用 python 自动安装,需要我做一些 hack 才能安装(自制软件问题?) - 我差点放弃了,如果我放弃了我就没有 pylint。)

因此,即使pylint确实发现了错误,我还是要问:

问:有什么方法可以让python本身为多重定义的函数报错或警告?

===

通过比较,并回应那些说 "Why would you want to do that in a dynamic language?"

的人

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

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

$>  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

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

您可以修饰所有函数并创建符号数据库并在重新定义时发出警告。

该语言没有内置任何内容,但您可以使用像 pylint 这样的代码检查工具(我相信还有其他工具),它会发现这些东西并警告您。