Python + 分解组合函数

Python + disassembling composed functions

我正在向我的学生介绍函数式编程的某些方面。我们使用 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))

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

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

感谢您的任何建议。

据我所知,仅通过 astdis 包的典型用法是不可能实现您想要的。这是因为就comp的AST或字节码而言,调用函数的实现是不敬的,它只需要知道加载正在引用的函数并调用它们即可。

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

我在这里整理了一个你必须做的事情的小例子 https://gist.github.com/buckley-w-david/e9c67cca7070282ddb5ab8d37de06f4e(需要 python 3.9+,并且对程序结构有很多假设它应该可以在 baked in 中工作),但如果你不熟悉在 Python.

中使用 AST,它会有点不透明