python - 获取闭包的父函数

标签 python closures

def foo():
    def bar():
        pass

    return bar

inner_func = foo()

是否可以通过某种方式从 inner_funcbar 获取对父函数 foo 的引用?

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

最佳答案

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

测试.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'

关于python - 获取闭包的父函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36240157/

相关文章:

python - Pytest monkeypatch 不适用于导入的函数

objective-c - Obj-C 到 Swift : Block to Closure/Delegate

python - 在 Python 中将 functools.partial 设置为实例方法

循环内的 JavaScript 闭包 – 简单的实际示例

swift - 使用 Swift 闭包。递归?

python - 在二维列表中拆分列表

Python 和 16 位 PGM

javascript - 在 get 请求的 do while 循环中使用闭包

python - 如何在 Python 中创建哈希算法的单独实例?

python - 我将如何修改/添加文本到 tkinter.Label?