删除功能

问题描述:

我试图创建一个函数来删除另一个函数。删除功能

def delete_function(func): 
    del func 

是我到目前为止,但由于某种原因它不起作用。

def foo(): 
    print("foo") 
delete_function(foo) 

似乎没有办法。我知道一个人可以很容易地做到这一点,只是

del(foo) 

但我试图做一个不同的方式。怎么样?

+5

什么是你希望用这种方法来解决这个问题? – SingleNegationElimination 2012-04-28 20:56:49

+1

确实。为什么为了代码的爱,为什么? – Macke 2012-04-28 21:04:41

+0

如果你必须这样做,你的实现可能有问题。 – 2012-04-28 21:52:47

删除函数并不是您对函数本身所做的事情;这是你对它所在的命名空间做的事情。(就像从列表中删除数字3不是你对数字3所做的事情,这是你对列表做的事情。)

假设你说

def foo(x): return 1 
bar = foo 

然后(或多或少),您有两个名称foobar,其功能完全相同。现在假设您致电delete_function(foo)delete_function(bar)完全相同的东西,即函数对象,正在传递给delete_function。但是你实际上想要删除的是名称foobar与该对象之间的关联 - 并且没有可能的方法delete_function(但是您可以定义它)可以知道它是foo还是bar或您想要摆脱的其他内容的。

(呃......实际上,有一些令人讨厌的黑客行为可以让delete_function中的代码知道更多关于它是如何被调用的,但是甚至都没有考虑过关于它们的想法。)

所以。您的选择如下。 (1)正如刚才提到的那样,讨厌的哈克东西。别。 (2)通过delete_function不是函数对象,而是关于函数名称和您试图从中删除它的信息。这是丑陋而不好看的。 (3)不要打扰。

我强烈建议#3,除非这样做的唯一原因是要了解有关Python如何工作的更多信息。在后一种情况下,开始的好地方可能是http://docs.python.org/reference/executionmodel.html

它只是不会工作。

你所要做的就是调用者的名字空间。

试试这个:

print "0", locals() 
def foo(): pass 
print "1", locals() 
del foo 
print "2", locals() 

注意

  1. 当地人快译通在0和2是相同的,并且在近1 - 除了它的foo额外的任务。
  2. del是一个声明,而不是一个功能

如果你在一个函数delete_function()del,基本上在函数中的分配被删除(因为该功能将被立即终止这是effectless),同时主叫方保持作业。

严格地说,del不会删除对象,而只是从名称到对象的赋值。只要对象不再被引用,对象就会自动删除(垃圾收集)。

它可以工作你试图通过检查栈框架和传递的名称被删除作为一个字符串,但它会是一个PITA。

也许你试着

del locals()['foo'] 

locals()['foo'] = 42 

?但我认为它不能保证它确实修改了真正的当地人字典,它可能会在副本上运行并因此保持无效...

由于foo是一个全球性的,可以从全局定义中删除:

def delete_func(func): 
    del globals()[func.func_name] 
+0

+1这就像是最简单的解决方案。 – 2012-04-28 21:03:24

+5

如果您尝试删除的'func'的定义实际上不在全局名称空间中,那就太糟糕了。 (例如,因为它在另一个函数中。) – 2012-04-28 21:13:07

+0

@GarethMcCaughan是的,这个解决方案只适用于全局函数(但我认为我的答案很清楚)。 – 2012-04-28 21:36:49