首页 > 解决方案 > Python + 反汇编组合函数

问题描述

我正在向我的学生介绍函数式编程的某些方面。我们使用 python 作为我们的主要语言。对我来说,组合函数是函数式编程的主要方面之一。为了说明这一点,我提出了以下示例,不过是经典的。

import dis 

def f(x):
    return 2*x+1

def g(x):
    return x**2

def comp(fun1, fun2):
    return lambda x:fun1(fun2(x))


dis.dis(f)
dis.dis(g)
dis.dis(comp(f,g))

comp(f,g)我只是想知道,有没有办法用dis模块取回表达式。我知道有一些参数可以调整递归调用的级别,但是我没有花足够的时间去探索。我还遇到了ast乍一看有点乏味的模块。

所以我认为这是 Stackoverflow 的一个问题:在符号计算的任何想法之前,有没有办法dis描述或显示这个表达式的抽象语法树?comp(f,g)lambda x:2*x**2+1ast

感谢您的任何建议。

标签: pythonfunctional-programmingabstract-syntax-treedisassemblyfunction-composition

解决方案


据我所知,仅仅通过astordis包的典型用法是不可能实现你想要的。这是因为就 AST 或字节码comp而言,要调用的函数的实现是无关紧要的,它只需要知道加载被引用的函数并调用它们。

如果您愿意更深入地挖掘,您可以模拟替换调用来代替它们的实现,如果您愿意通过构建和操作 AST 来牺牲执行实际工作方式的准确性,则可以模拟函数组合,替换内部的调用comp与他们正在调用的函数的实现。

我整理了一个小例子,说明你必须在这里做的事情https://gist.github.com/buckley-w-david/e9c67cca7070282ddb5ab8d37de06f4e(需要 python 3.9+,并且对结构有很多假设它应该在烘焙的程序中运行),但如果你不熟悉在 Python 中使用 AST,它会有点不透明。


推荐阅读