3

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

2 回答 2

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

于 2013-06-23T17:41:12.207 回答
0

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

于 2013-06-23T17:58:52.340 回答