2015-02-06 34 views
1

今天我正面临一个有关内置函数min()的奇怪的bug。 我注意到在程序执行过程中被重写,所以当min()被覆盖(print(min.__module__)),并且我得到了 UnboundLocalError:之前引用的局部变量'min'时,我开始寻找堆栈的每个函数分配 我仍然在调试并在提交之间来回检查是什么导致问题。程序依赖于不同的模块,但模块与程序最后一次成功相同。如何删除python builtins? min()在某个函数被调用时消失

我想知道,如何删除内建的“min”?我相信我还没有用这个名字声明任何变量,即使我有了,错误也会不同。 del min应该还原内置(但对我来说,我得到上述错误) 内建 [“分钟”]工作(在3个系统,我试过2)

的这怎么可能知道吗?

回答

5

一般来说,local variable referenced before assignment的原因是不是有人已删除min,那就是你已经分配给点您收到的错误后,你的函数命名为min某处变量。 (这个作业也可能是在没有拿到,之前错误的if分支,但在我的经验,我提出的第一个方案的可能性更大。)

既然你已经在某处功能分配给它并没有声明它是全局的,它是该函数内的局部变量,并且它的所有用途都指向该局部变量,而不是内置函数。然而,你还没有给它赋值,所以Python不知道你想要它有什么价值。

实施例:

def test(): 
    x = min(1, 2, 3)     # error message here 
    y = max(1, 2, 3) 
    # ... lots of code might go here 
    min = x if x < y else y   # local assignment here 

test() 

的解决方案是简单的。不要这样做。使用min以外的名称作为自己的变量。事实上,出于这个原因,避免为了你自己的目的使用内置的名字是一个好习惯。

+2

**“解决方案很简单,不要那样做。“**一个真正的程序员 - 即使他的答案是超级可重用的! DRY确实 – 2015-02-06 00:32:16

+0

@kindall第三种情况可能类似于将min(a,b)作为参数传递给函数(可能会修改其参数)或作为字典的值?我确信我没有拿起这个名字,我甚至在项目的所有文件中都搜索过它! – lib 2015-02-06 00:44:54

+1

不应该。只发布实际发生错误的函数的代码将有助于我们将其锁定。 – kindall 2015-02-06 00:46:09

2

你可以删除它,但你必须这样做明确:

>>> min(5,5) 
5 
>>> del __builtins__.min 
>>> min(5,5) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'min' is not defined 

距离内的功能并不能__builtins__删除它,所以你的被叫必须做是故意将其删除

+0

对不起,我错过了问题的格式。实际上函数仍然在__builtins__中,错误只在一个系统中,我得到最小= __builtins __ ['min'] TypeError:'模块'对象不可订阅 – lib 2015-02-06 00:30:24

相关问题