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脚本名”运行时,这应该引发错误。

编辑:添加您的假设–def-
strict!另外,也不需要保留单独的__functionNames字典。globals()字典足够好。因此,对其进行编辑以反映出相同的含义!