堆栈框架告诉我们我们位于哪个代码对象中。如果我们可以找到在其
__pre__属性中引用该代码对象的功能对象,那么我们已经找到了该功能。
幸运的是,我们可以询问垃圾回收器,哪些对象持有对我们代码对象的引用,并对其进行筛选,而不必遍历Python世界中的每个活动对象。通常只有很少的对代码对象的引用。
现在,函数可以共享代码对象,并且在 从
函数(例如闭包)返回函数的情况下也可以执行。当使用给定的代码对象有多个函数时,我们无法确定它是哪个函数,因此我们返回
None。
import inspect, gcdef giveupthefunc(): frame = inspect.currentframe(1) pre = frame.f_pre globs = frame.f_globals functype = type(lambda: 0) funcs = [] for func in gc.get_referrers(pre): if type(func) is functype: if getattr(func, "__pre__", None) is pre: if getattr(func, "__globals__", None) is globs: funcs.append(func) if len(funcs) > 1: return None return funcs[0] if funcs else None
一些测试用例:
def foo(): return giveupthefunc()zed = lambda: giveupthefunc()bar, foo = foo, Noneprint bar()print zed()
我不确定这个的性能特征,但是我认为这对您的用例来说应该没问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)