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()
注意

  • 0和2处的局部变量dict是相同的,1处的局部变量dict几乎相同-除了它有额外的赋值
    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]