__getitem__ 或方括号用于递归数据结构

pca*_*cao 5 python recursion

StackOverflowers 的朋友们大家好,

我正在实现一个二叉搜索树,其接口与 Python 中的接口几乎相同dict(在有人问之前,我这样做是为了好玩,没有生产代码)。

为了从树中添加、检索和删除元素,我实现了__getitem____setitem____delitem__,效果很好。

问题是,由于这是一个递归数据结构,如果当前节点没有我要查找的键,我的__getitem__方法本身会调用树的左分支或右分支。__getitem__

__getitem__通过or进行此递归调用的最“Pythonic”方式是什么[]

例子:

def __getitem__(self, key):
    if key  == self.key:
        return self.value
    if key < self.key and self.left is not None:
        return self.left[key]
    if key > self.key and self.right is not None:
        return self.right[key]
    return None
Run Code Online (Sandbox Code Playgroud)

相对

def __getitem__(self, key):
    if key  == self.key:
        return self.value
    if key < self.key and self.left is not None:
        return self.left.__getitem__(key)
    if key > self.key and self.right is not None:
        return self.right.__getitem__(key)
    return None
Run Code Online (Sandbox Code Playgroud)

我知道它们的工作原理完全相同,一个是另一个的包装,但这是一个风格问题。

直接使用[]提供了更简洁的代码,更少的冗长,但可能会误导那些不能立即理解该指令基本上是方法的递归调用的人,因此__getitem__消除了歧义。

请记住,我并不是在谈论在外部调用中使用其中之一,显然[]应该在这种情况下使用,而只是在方法内部作为递归调用。

你怎么看?

mgi*_*son 2

我通常使用[],但这并不重要......我不知道关于这个问题的任何风格指南。


请注意,当您调用__getitem__父类时,您需要使用__getitem__而不是[...]. 例如

class getDict(dict):
   def __getitem__(self,key):
       if key in self:
          return dict.__getitem__(self,key)
       else:
          return None
Run Code Online (Sandbox Code Playgroud)

但这不是你在这里要处理的......

请不要使用此代码——它并不是一个好的代码示例(return dict.get(self,key,None)会更好)。这只是一个易于阅读的插图