递归搜索对象并在找到时编辑字符串

Recursively searching an object and editing a string when found

我是 python 的新手,在处理不可变字符串时遇到问题。我的问题如下:

我有一棵树,其中每个节点都是一个字典,每个节点都有可变数量的子节点。我想在这棵树上执行多个操作,因此递归遍历它。

我的设置是 class 使用以下函数遍历树:

def __recursiveDive(self, node, enterFunc, leaveFunc, parentNode):
    if self.__break:
        return

    if not self.__skipNode:
        enterFunc(node, parentNode, self)
        if isinstance(node, dict):
            for key, value in node.items():
                self.__recursiveDive(value, enterFunc, leaveFunc, node)
        elif isinstance(node, list):
            for child in node:
                if isinstance(child, dict):
                    self.__recursiveDive(child, enterFunc, leaveFunc, node)

        leaveFunc(node, parentNode, self)
    else:
        self.__skipNode = False

enterFunc 和 leaveFunc 是在外部定义的,并在 tree/node.

上执行所需的工作

我的问题是,由于 python 字符串是不可变的,我觉得我无法修改树中的任何字符串字段。 enterFunc,属于另一个class的一个函数,传递给class如下:

def enter(self, node, parentNode, traverser):
    if isinstance(node, str):
        search = re.search(self.regexPattern, node)
        if search:
            node = node.replace(search.group(2),self.modifyString(search.group(2)))

这里对节点的更改只是本地的。我唯一的解决方案是让节点具有进入和离开功能 return 吗?

解决此问题的 correct/pythonic 方法是什么?

对于那些想要解决方案的 TL;DR 的人

确保您的模式 return 是已完成工作的变量。

您的 enterFuncleaveFunc 应该 return 修改后的对象,而不是试图就地修改它。然后 __recursiveDive 函数可以用 returned 对象替换原始对象。

通常你会以这样的方式实现 __recursiveDive 它知道 节点的键和值,但这似乎并不在您的代码中就是这种情况 - 它传递了一个 node 变量,但没有传递相应的键。它应该像这样工作(显然是伪代码):

def __recursiveDive(self, enter, leave):
    for key, value in self.nodes:
        new_value= enter(value)
        self.nodes[key]= new_value

        if isinstance(new_value, dict):
            new_value.__recursiveDive(enter, leave)

        new_value= leave(new_value)
        self.nodes[key]= new_value