在 public 和 Python 中的私有方法之间进行重构

Refactoring between public and private methods in Python

我正在查看教程 "Problem Solving with Algorithms and Data Structures" 中的二叉搜索树部分,(http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html)。在某些情况下,他们使用同名的 "public" 和 "private" 辅助方法,例如对于 "put" 方法:

def put(self,key,val):
    if self.root:
        self._put(key,val,self.root)
    else:
        self.root = TreeNode(key,val)
    self.size = self.size + 1

def _put(self,key,val,currentNode):
    if key < currentNode.key:
        if currentNode.hasLeftChild():
               self._put(key,val,currentNode.leftChild)
        else:
               currentNode.leftChild = TreeNode(key,val,parent=currentNode)
    else:
        if currentNode.hasRightChild():
               self._put(key,val,currentNode.rightChild)
        else:
               currentNode.rightChild = TreeNode(key,val,parent=currentNode)

我在其他地方也看到过这种方法,但我不太明白其动机。与直接将所有内容放在一个方法中相比有什么优势,是否只是为了提高可读性?

理由是 class 的用户不应该对 "current node" 有任何了解。当前节点仅在递归插入过程中才有意义,它不是树的永久属性。用户将树视为一个整体,并且只对其进行 insert/lookup 操作。

就是说,您 可以 将两种方法合二为一,方法是使用默认值 currentNode=None 并检查它。但是,这两种方法做的事情截然不同。 put 方法只是初始化根,而 _put 进行递归插入,所以最好将它们分开。

在这里,动机是使用递归。您可能已经注意到,_put 方法调用自身并且方法签名不同。如果将 _put 方法放入 public 方法中,则必须更改 public 方法的签名以处理给定节点上的放置操作。简单地说,您必须添加 currentNode 参数。但是,原来的public方法没有这个参数。我想,这是因为作者不想向最终用户公开此功能。