递归搜索对象并在找到时编辑字符串
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 是已完成工作的变量。
您的 enterFunc
和 leaveFunc
应该 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
我是 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 是已完成工作的变量。
您的 enterFunc
和 leaveFunc
应该 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