调用weakref传递的Python函数

时间:2011-08-02 21:51:41

标签: c++ python boost

使用Boost.Python,有没有办法调用已经通过weakref传递的Python函数?以下代码不起作用:

import weakref

def foo():
    print 'it works'

def func():
    return weakref.ref(foo)

以下是C ++:

object module = import("test");
object func(module.attr("func"));
object foo = func();
foo(); // Should print 'it works', but it prints nothing

但是,如果我在没有weakref的情况下传递函数对象,那么一切正常。有没有办法让这项工作?

2 个答案:

答案 0 :(得分:5)

来自weakref documentation

  

返回对象的弱引用。 如果指示对象还活着,可以通过调用引用对象来检索原始对象...

所以,给你的片段:

import weakref

def foo():
    print "It Works!"

def func():
    return weakref.ref(foo)

ref = func() # func returns the reference to the foo() function
original_func = ref() # calling the reference returns the referenced object
original_func() # prints "It Works!"

答案 1 :(得分:4)

这可以为你解决。

>>> import weakref
>>> def foo(): print 'it works'
...
>>> x = weakref.ref(foo)
>>> x()()
it works
>>> x()
<function foo at 0x7f56c10acc80>