获取关闭的父函数

时间:2016-03-26 19:53:22

标签: python closures

def foo():
    def bar():
        pass

    return bar

inner_func = foo()

以某种方式可以从fooinner_func引用父函数bar吗?

查看PythonTutorOnline的源代码,我找到了我需要的内容here。有没有其他方法可以做到这一点?如果不是我如何在不使用Bdb的情况下获得当前的堆栈信息?

2 个答案:

答案 0 :(得分:1)

这只会在另一个函数体内找到FunctionDef:

test.py

def bar():
    pass

def foo():
    def bar():
        pass
    return bar

inner_func = foo()

代码:

import ast


def find_parent(par):
    for par_node in mod.body:
        if isinstance(par_node, ast.FunctionDef):
            for node in par_node.body:
                if isinstance(node, ast.FunctionDef) and node.name == inner_func.func_name:     
                    return eval(par_node.name)

输出:

n [12]: from test import  *

In [13]: mod =  ast.parse(open("/home/padraic/test.py").read())

In [14]: find_parent(mod)
Out[14]: <function test.foo>

In [15]: find_parent(mod).func_name
Out[15]: 'foo'

答案 1 :(得分:0)

这远非完美,但这是一个想法:

getattr(__import__(foo().__module__), 'foo')

根据@zondo的评论,可以以某种方式获得名称'foo'