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+1
或 ast
显示此表达式的抽象语法树 ?
感谢您的任何建议。
据我所知,仅通过 ast
或 dis
包的典型用法是不可能实现您想要的。这是因为就comp
的AST或字节码而言,调用函数的实现是不敬的,它只需要知道加载正在引用的函数并调用它们即可。
如果您愿意更深入地挖掘,如果您愿意通过构建和操纵 AST 来牺牲执行实际工作方式的准确性,则可以模拟替代调用来实现它们的实现,只是为了对函数组合进行建模,将 comp
中的调用替换为他们正在调用的函数的实现。
我在这里整理了一个你必须做的事情的小例子 https://gist.github.com/buckley-w-david/e9c67cca7070282ddb5ab8d37de06f4e(需要 python 3.9+,并且对程序结构有很多假设它应该可以在 baked in 中工作),但如果你不熟悉在 Python.
中使用 AST,它会有点不透明
我正在向我的学生介绍函数式编程的某些方面。我们使用 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+1
或 ast
显示此表达式的抽象语法树 ?
感谢您的任何建议。
据我所知,仅通过 ast
或 dis
包的典型用法是不可能实现您想要的。这是因为就comp
的AST或字节码而言,调用函数的实现是不敬的,它只需要知道加载正在引用的函数并调用它们即可。
如果您愿意更深入地挖掘,如果您愿意通过构建和操纵 AST 来牺牲执行实际工作方式的准确性,则可以模拟替代调用来实现它们的实现,只是为了对函数组合进行建模,将 comp
中的调用替换为他们正在调用的函数的实现。
我在这里整理了一个你必须做的事情的小例子 https://gist.github.com/buckley-w-david/e9c67cca7070282ddb5ab8d37de06f4e(需要 python 3.9+,并且对程序结构有很多假设它应该可以在 baked in 中工作),但如果你不熟悉在 Python.
中使用 AST,它会有点不透明