基于流的表达式访问器
(类来自 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)walk_expression(expr)遍历一个表达式,调用已注册的回调函数。
非递归地遍历表达式,调用已注册的回调函数。
属性
client_methods成员文档
- walk_expression(expr)[source]
遍历一个表达式,调用已注册的回调函数。
这是运行访问者的标准接口。它默认使用访问者的高效递归实现,如果递归堆栈太深,则回退到
walk_expression_nonrecursive()。