Obtenção de objeto de chamada do quadro

Dado o objeto frame (como retornado porsys._getframe, por exemplo), posso obter o objeto de chamada subjacente?

Explicação de código:

def foo():
    frame = sys._getframe()
    x = some_magic(frame)

    # x is foo, now

Observe que meu problema é tirar o objeto de um quadro, não do objeto atualmente chamado.

Espero que seja possível.

Felicidades,

MH

EDITAR:

De alguma forma, consegui contornar esse problema. Foi fortemente inspirado pelas respostas de Andreas e Alexander. Obrigado pessoal pelo tempo investido!

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

(funciona em 2.6.2, para py3k substituafunc_code com__code__ eim_func com__func__)

Então, eu posso percorrer agressivamente globals () ou gc.get_objects () e dir () tudo em busca do callable com o objeto de função fornecido.

Parece um pouco não-patético para mim, mas funciona.

Obrigado novamente!

MH

questionAnswers(3)

yourAnswerToTheQuestion