我是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方式是什么?
确保您的模式返回已完成工作的变量。
答案 0 :(得分:1)
您的enterFunc
和leaveFunc
应该返回修改后的对象,而不是尝试就地修改它。然后__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