python - 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+1
ast
感谢您的任何建议。
解决方案
据我所知,仅仅通过ast
ordis
包的典型用法是不可能实现你想要的。这是因为就 AST 或字节码comp
而言,要调用的函数的实现是无关紧要的,它只需要知道加载被引用的函数并调用它们。
如果您愿意更深入地挖掘,您可以模拟替换调用来代替它们的实现,如果您愿意通过构建和操作 AST 来牺牲执行实际工作方式的准确性,则可以模拟函数组合,替换内部的调用comp
与他们正在调用的函数的实现。
我整理了一个小例子,说明你必须在这里做的事情https://gist.github.com/buckley-w-david/e9c67cca7070282ddb5ab8d37de06f4e(需要 python 3.9+,并且对结构有很多假设它应该在烘焙的程序中运行),但如果你不熟悉在 Python 中使用 AST,它会有点不透明。
推荐阅读
- mean-stack - MEAN STACK-index.html 中的 app-root 未呈现
- php - 对不同域名的不同语言使用同一页面
- ios - 快速解码base64字符串出错了
- python - Python 控制台不显示函数的输出
- python - 如何在numpy中更新点积?
- ios - 在 UITableViewDataSource 扩展中实现 UITableViewDelegate 方法
- java - setTitle 在其他初始化方法中折叠工具栏
- javascript - 在给定已知索引范围的日期之间插值
- typescript - 导入模块会破坏具有属性的本地类型在类型上不存在
- c# - 了解适配器模式 (c#)