【问题标题】:Python + disassembling composed functionsPython + 反汇编组合函数
【发布时间】:2021-03-04 16:56:42
【问题描述】:

我正在向我的学生介绍函数式编程的某些方面。我们使用 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 模块,乍一看有点乏味。

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

感谢您的建议。

【问题讨论】:

    标签: python functional-programming abstract-syntax-tree disassembly function-composition


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了!谢谢 !我要仔细看看你的代码。再次感谢,太棒了。我从 Python 3.8.5 运行您的代码。只需点安装astunparse
    • @smeden 如果您要摆弄它,我建议您也安装 astpretty,github.com/asottile/astpretty。您可以使用它来漂亮地打印 AST,因此它们实际上是可读的。如果您认为这可以回答问题,您介意接受吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2010-10-10
    • 2013-01-24
    • 2022-12-10
    • 2018-06-23
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多