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

时间:2016-07-26 11:54:51

标签: python string design-patterns recursion immutability

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

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

设置是我有类使用以下函数遍历树:

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在外部定义,并在树/节点上执行所需的工作。

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

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)))

此处对节点的更改仅限本地。我的唯一解决方案是让enter和leave函数返回节点吗?

解决此问题的正确/ pythonic方式是什么?

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

确保您的模式返回已完成工作的变量。

1 个答案:

答案 0 :(得分:1)

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

通常你会以这样的方式实现__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