将声明性DSL转换为嵌套函数调用

2024-04-27 07:54:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python库,它用nested function calls构建特殊迭代器(行为树)。虽然API有一个相当好且轻量级的语法(因为它是python),但它确实可以使用声明性DSL。在

下面是我设想的一个粗略的草图:

DSL(使用YAML):

tree:
  - sequence:
    - do_action1
    - do_action2
    - select:
      - do_action3
      - sequence:
        - do_action4
        - do_action5
      - do_action6

将导致以下嵌套函数调用:

^{pr2}$

我很难想象到底该怎么做。因为DSL必须表示一棵树,所以简单的深度优先遍历似乎是合适的。但是为了构建嵌套的函数调用,我必须以某种方式把它翻出来。它可能涉及到一些巧妙的中介堆栈或类似的东西,但我不能完全理解它。执行这种转换的正确方法是什么?在


Tags: apitree声明yaml语法functiondodsl
1条回答
网友
1楼 · 发布于 2024-04-27 07:54:07

我认为可以让python跟踪函数调用和参数,而不是自己用堆栈来跟踪。在

假设您有一个YAML解析树,其中每个节点代表一个函数调用,而这个节点的每个子节点都是一个参数(这也是一个函数调用,因此它可能有自己的参数)。在

然后定义函数evaluate,该函数计算该树的一个节点,如下所示(伪代码):

def evaluate(node):
    # evaluate parameters of the call
    params = []
    for child in node:
        params.append(evaluate(child))

    # now make the call to whatever function this node represents,
    # passing the parameters
    return node.function.call(*params)

最后,调用evaluate,将YAML树的根作为参数传递,您应该得到所需的行为。在


略有不同的eval apply结构

^{pr2}$

相关问题 更多 >