在处理足够大的python文件时,我不小心重新定义了全局范围内的函数。如果python翻译可以在这些情况下警告我,我将不胜感激。
想象一下你从这段代码开始(版本1):
#!/usr/bin/env python
... lots of code ...
def foo(version):
if version == 1:
return "Correct"
return "Oops!"
... lots more code ...
print foo(1)
哪种方法有效:
Correct
然后你想改变一些东西,并称之为版本2.你重写foo函数,但你要么没有意识到旧的存在,要么忘记删除它。你最终得到了这个:
#!/usr/bin/env python
def foo(version):
if version == 2:
return "Correct"
return "Oops!"
... lots of code ...
def foo(version):
if version == 1:
return "Correct"
return "Oops!"
... lots more code ...
print foo(2)
哪个效果不好:
Oops!
我知道python允许这样的代码:
def monkey():
return "patching"
monkey = "is"
def monkey():
return {"really": "fun"}
但似乎使用“def”这种做法很糟糕。
我有什么方法可以得到这种行为:
#!/usr/bin/env python --def-strict
def foo():
pass
def foo():
pass
结果:
Traceback (most recent call last):
File ..., line 3, in <module>
NameError: name 'foo' is already defined
答案 0 :(得分:2)
您可以创建一个装饰器,它可以比较函数的名称,也可以将其存储在字典中。如果密钥已经存在,您可以从装饰器中抛出异常!在开发期间使用此装饰器装饰所有功能。在完成所有测试后,您可以摆脱装饰!
像
这样的东西
#import sys
if sys.argv[1] == "--def-strict":
def duplicateFinder(f):
if globals().has_key(f.__name__):
raise AttributeError, "This module already has a function %s defined" % f.__name__
return f
else:
def duplicateFinder(f):
return f
@duplicateFinder
def myFunction():
print "Hello World!"
@duplicateFinder
def myFunction():
print "Hello World Again!!!"
使用“python --def-strict scriptname”运行时会抛出错误。
编辑:添加你的假设--def-strict!此外,无需保留单独的__functionNames字典。 globals()字典足够好了。所以编辑它以反映相同!
答案 1 :(得分:0)
我不认为Python解释器的标志可以帮助你,但你可以使用像pyflakes这样的静态代码分析工具,它会警告你重新定义(至少在某些情况下)。 / p>