gpt4 book ai didi

python - python 解释器能否在重新声明的函数上失败?

转载 作者:行者123 更新时间:2023-11-28 18:48:15 25 4
gpt4 key购买 nike

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

最佳答案

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

有点像


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

关于python - python 解释器能否在重新声明的函数上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com