我正在尝试创建一个删除其他功能的功能。
def delete_function(func):
del func
是我到目前为止所做的,但由于某种原因它不起作用。
def foo():
print("foo")
delete_function(foo)
似乎没有做到这一点。我知道人们可以轻松地做到这一点,只是
del(foo)
但我正试图以不同的方式做到这一点。怎么样?
答案 0 :(得分:15)
删除一个函数并不是你对函数本身所做的事情;这是你对它所在的命名空间所做的事情。(就像从列表中删除数字3不是你对数字3做的那样,这是你对列表所做的事情。)
假设你说
def foo(x): return 1
bar = foo
然后(或多或少)你有两个名字,foo
和bar
,完全相同的功能。现在假设您拨打delete_function(foo)
或delete_function(bar)
。 完全相同的东西,即一个函数对象,正被传递给delete_function
。但是你真正要删除的是名称foo
或bar
与该对象之间的关联 - 并且没有可能的方式delete_function
(但是你定义它)可以知道它是否是{ {1}}或foo
或其他您想要摆脱的东西。
(嗯......实际上,有。你可以做的讨厌的hacky事情会让bar
中的代码更多地了解它是如何被调用的。但是,甚至不要考虑考虑它们。)
因此。您的选择如下。 (1)刚刚提到的讨厌的hacky事物。别。 (2)传递delete_function
而不是函数对象,但是有关函数名称和您尝试从中删除它的信息。这是丑陋和笨拙的。 (3)不要打扰。
我强烈推荐#3,,除非你这样做的唯一原因是要了解Python的工作原理。在后一种情况下,开始的好地方可能是http://docs.python.org/reference/executionmodel.html。
答案 1 :(得分:9)
由于foo
是全局的,您可以从全局定义中删除它:
def delete_func(func):
del globals()[func.func_name]
答案 2 :(得分:5)
它不起作用。
您要做的主要是调用者的名称空间。
试试这个:
print "0", locals()
def foo(): pass
print "1", locals()
del foo
print "2", locals()
请注意
foo
的额外作业。del
是一个声明,而不是一个函数如果在函数del
中执行delete_function()
,实际上函数中的赋值将被删除(因为函数立即终止,这是无效的),而调用者保留赋值。
严格来说,del
不会删除对象,只会删除从名称到对象的分配。一旦不再引用对象,对象就会被“自动”删除(垃圾回收)。
它可以通过检查堆栈帧并将要删除的名称作为字符串传递来尝试工作,但它将是PITA。
也许你试试
del locals()['foo']
或
locals()['foo'] = 42
?但我认为它并不能保证它真正修改了真正的本地词典,它也可以在副本上运行,从而保持无效......
答案 3 :(得分:0)
如果您使用的是python 3,这应该可以:
def foo():
return 'foo'
del foo