Python 删除函数
我正在尝试创建一个函数来删除另一个函数Python 删除函数,python,Python,我正在尝试创建一个函数来删除另一个函数 def delete_function(func): del func 这是我目前所拥有的,但由于某种原因,它不起作用 def foo(): print("foo") delete_function(foo) 这似乎不起作用。我知道一个人很容易做到,只是 del(foo) 但我试着用另一种方式。怎么做?它就是不起作用 实际上,您要做的是调用方的名称空间 试试这个: print "0", locals() def foo(): pas
def delete_function(func):
del func
这是我目前所拥有的,但由于某种原因,它不起作用
def foo():
print("foo")
delete_function(foo)
这似乎不起作用。我知道一个人很容易做到,只是
del(foo)
但我试着用另一种方式。怎么做?它就是不起作用
实际上,您要做的是调用方的名称空间
试试这个:
print "0", locals()
def foo(): pass
print "1", locals()
del foo
print "2", locals()
注意
foo
del
是一个语句,而不是一个函数delete\u function()
中执行del
,则函数中的赋值基本上会被删除(这是无效的,因为函数会立即终止),而调用者会保留赋值
严格地说,del
不删除对象,而只是从名称到对象的赋值。对象一旦不再被引用,就会被“自动”删除(垃圾回收)
通过检查堆栈框架并将要删除的名称作为字符串传递,它可以完成您尝试执行的操作,但它将是一个PITA
也许你可以试试
del locals()['foo']
或
??但我认为不能保证它真的修改了真正的本地词典,它也可以对副本进行操作,从而保持无效…删除函数并不是对函数本身所做的事情;这是您对它所在的名称空间所做的操作。(正如从列表中删除数字3不是对数字3所做的事情,而是对列表所做的事情。) 假设你说
def foo(x): return 1
bar = foo
然后(或多或少)对于完全相同的函数,您有两个名称,foo
和bar
。现在假设您调用delete\u函数(foo)
或delete\u函数(bar)
。完全相同的东西,即一个函数对象,正在传递给delete\u function
。但是你实际上想要删除的是名称foo
或bar
与该对象之间的关联,而且delete\u函数(不管你如何定义)不可能知道它是foo
还是bar
,或者其他你想要摆脱的东西
(嗯……事实上,确实有。你可以做一些令人讨厌的黑客行为,让delete\u函数中的代码更多地了解它是如何被调用的。但你甚至都不要去想它们。)
所以。你的选择如下。(1) 就像刚才提到的,肮脏的东西。不要。(2) 传递delete_function
的不是函数对象,而是关于函数名称和要从中删除它的内容的信息。这既丑陋又笨拙。(3) 不用麻烦了
我强烈推荐#3,除非您这样做的唯一原因是为了了解更多关于Python如何工作的信息。在后一种情况下,一个好的起点可能是。因为foo
是一个全局定义,您可以从全局定义中删除它:
def delete_func(func):
del globals()[func.func_name]
如果您使用的是python 3,这应该可以:
def foo():
返回“foo”
德福
您希望用这种技术解决的问题是什么?确实如此。为什么,出于对代码的热爱,为什么?如果你必须这样做,那么你的实现可能有问题。Joe Loo,如果给你的答案中有一个确实回答了你的问题——我的或者GLGL说“不,不要这样做”,或者Omri的,在某些情况下给出一种方法,但在其他情况下可能会做错事——那么你应该接受最能回答你问题的答案。如果没有,您应该编辑您的问题,使其更清楚您认为还需要回答的问题。如果您试图删除的func
的定义实际上不在全局命名空间中,那就太糟糕了。(例如,因为它在另一个函数中。)@GarethMcCaughan是的,这个解决方案只适用于全局函数(但我认为我的答案非常清楚)。这是最简单的选择,对我来说是有效的,而其他方法则不然。
def delete_func(func):
del globals()[func.func_name]