【发布时间】:2010-11-11 01:52:57
【问题描述】:
给定框架对象(例如由sys._getframe 返回),我可以得到底层的可调用对象吗?
代码说明:
def foo():
frame = sys._getframe()
x = some_magic(frame)
# x is foo, now
请注意,我的问题是将对象从框架中取出,而不是当前调用的对象。
希望这是可能的。
干杯,
MH
编辑:
我已经设法解决了这个问题。它深受 Andreas 和 Alexander 回复的启发。感谢大家投入的时间!
def magic():
fr = sys._getframe(1)
for o in gc.get_objects():
if inspect.isfunction(o) and o.func_code is fr.f_code:
return o
class Foo(object):
def bar(self):
return magic()
x = Foo().bar()
assert x is Foo.bar.im_func
(适用于 2.6.2,对于 py3k,将 func_code 替换为 __code__,将 im_func 替换为 __func__)
然后,我可以积极地遍历 globals() 或 gc.get_objects() 和 dir() 一切以寻找具有给定函数对象的可调用对象。
对我来说感觉有点不合时宜,但很有效。
再次感谢!
MH
【问题讨论】:
-
正如您在下面的答案中看到的那样,这是可以做到的。虽然不推荐。你想达到什么目的?很可能可以通过其他方式完成。
-
我正在尝试做的实际事情是记录程序中的所有函数调用(并稍后处理那些被调用的函数)。为此,我正在使用 bdb 模块跟踪所有堆栈帧 - 它为我提供了帧对象。我会非常感谢任何想法!
-
按照流程,您是说要给他们打电话还是在做其他事情?
-
看看这个:stackoverflow.com/questions/541329/…我不羡慕你...
-
@MikeHordecki,您可以使用
gc.get_referrers(fr.f_code)代替gc.get_objects()。
标签: python