python解释器在重新声明的函数上会失败吗



在处理一个足够大的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

您可以创建一个装饰器,它可以比较函数的名称,并可能将其存储在字典中。如果键已经存在,则可以从装饰器抛出异常!在开发过程中,用这个装饰器装饰你的所有函数。在完成所有测试后,你就可以去掉装饰了!

类似的东西


#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()字典已经足够好了。所以编辑它以反映相同!

我不认为Python解释器有一个标志可以帮助你,但你可以使用像pyflakes这样的静态代码分析工具,它会警告你重新定义(至少在某些情况下)。

相关内容

  • 没有找到相关文章