基于流的表达式访问器

(类来自 pyomo.core.expr.visitor)

class pyomo.core.expr.visitor.StreamBasedExpressionVisitor(**kwds)[source]

基础类:object

该类实现了一个通用的基于流的表达式遍历器。

此访问者使用深度优先策略遍历表达式树,并生成与其他树访问者类似的全事件流(例如,expat XML解析器)。在遍历进入和离开树中的节点时,通过回调函数触发以下事件:

initializeWalker(expr) -> walk, result
enterNode(N1) -> args, data
{for N2 in args:}
  beforeChild(N1, N2) -> descend, child_result
    enterNode(N2) -> N2_args, N2_data
    [...]
    exitNode(N2, n2_data) -> child_result
  acceptChildResult(N1, data, child_result) -> data
  afterChild(N1, N2) -> None
exitNode(N1, data) -> N1_result
finalizeWalker(result) -> result

单个事件回调匹配以下签名:

walk, result = initializeWalker(self, expr):

initializeWalker() 被调用来设置遍历器并对根节点进行任何初步处理。该方法返回一个标志,指示是否应遍历树以及一个结果。如果 walk 为 True,则忽略结果。如果 walk 为 False,则 result 将作为遍历器的最终结果返回,绕过所有其他回调(包括 finalizeResult)。

args, data = enterNode(self, node):

当遍历器首次进入一个节点(从上方)时,会调用enterNode(),并传入被进入的节点。它预期返回一个子args的元组(作为元组或列表)和一个用户指定的用于收集结果的数据结构。如果args返回None,则节点的args属性用于表达式类型,叶节点则使用空元组。返回None等同于返回(None,None)。如果未定义回调,默认行为等同于返回(None, [])。

node_result = exitNode(self, node, data):

exitNode() 在节点完全处理后被调用(当遍历器返回到父节点时)。它接收节点和结果数据结构(由 enterNode() 定义,并可能由 acceptChildResult() 进一步修改),并期望返回该节点的“结果”。如果未指定,默认操作是返回 enterNode() 中的数据对象。

descend, child_result = beforeChild(self, node, child, child_idx):

beforeChild() 由节点在进入子节点之前为每个子节点调用。节点、子节点和子节点索引(在 enterNode() 的 args 列表中的位置)作为参数传递。beforeChild 应返回一个元组 (descend, child_result)。如果 descend 为 False,则不会进入子节点,并且返回给 child_result 的值将传递给节点的 acceptChildResult 回调。返回 None 等同于 (True, None)。如果未指定,默认行为等同于 (True, None)。

data = acceptChildResult(self, node, data, child_result, child_idx):

acceptChildResult() 被调用以处理每个返回给节点的子结果。此回调负责记录结果以便后续处理或向上传递。它接收节点、结果数据结构(参见 enterNode())、子结果以及子索引(在 enterNode() 的 args 中的位置)。必须返回数据结构(可能被修改或替换)。如果未指定 acceptChildResult,当数据为 None 时它不执行任何操作,否则它会调用 data.append(result)。

afterChild(self, node, child, child_idx):

afterChild() 由节点在每个子节点处理完成后立即调用,在控制转移到下一个子节点或返回到父节点之前。节点、子节点和子节点索引(来自 enterNode() 的参数中的位置)被传递,没有返回值。如果未指定 afterChild,则不执行任何操作。

finalizeResult(self, result):

finalizeResult() 在整个表达式树被遍历后调用一次。它接收由根节点的 exitNode() 回调返回的结果。如果未指定 finalizeResult,遍历器将返回从根节点的 exitNode 回调获得的结果。

客户端通过以下方式与此类交互:从它派生并实现必要的回调(见上文),将可调用函数分配给此类的实例,或将回调函数作为参数传递给此类的构造函数。

__init__(**kwds)[source]

方法

__init__(**kwds)

walk_expression(expr)

遍历一个表达式,调用已注册的回调函数。

walk_expression_nonrecursive(expr)

非递归地遍历表达式,调用已注册的回调函数。

属性

client_methods

成员文档

walk_expression(expr)[source]

遍历一个表达式,调用已注册的回调函数。

这是运行访问者的标准接口。它默认使用访问者的高效递归实现,如果递归堆栈太深,则回退到walk_expression_nonrecursive()

walk_expression_nonrecursive(expr)[source]

非递归地遍历表达式,调用已注册的回调函数。

这个例程对于深度(或不平衡)树来说比递归遍历更安全。然而,它比递归实现稍微慢一些。