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

5

大家好,

我正在实现一个二叉搜索树,它的接口与Python中的dict基本相同(在有人问之前,我只是出于兴趣这样做,并非生产代码)。

为了向我的树添加、检索和删除元素,我已经实现了__getitem____setitem____delitem__,效果很好。

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

最“Pythonic”的方式是通过__getitem__还是[]进行这个递归调用呢?

示例:

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

对比

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

我知道它们的工作方式完全相同,只是一种包装另一种的形式,但这是一个风格问题。

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

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

你有什么想法?

2个回答

3

使用 [ ] 的方式。它就是为此而设计的。如果你唯一的担忧是误导代码的其他读者,你可以简单地在代码中添加注释来解决。


2

我通常使用[],但实际上并不重要...我不知道这个问题是否有任何样式指南。


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

class getDict(dict):
   def __getitem__(self,key):
       if key in self:
          return dict.__getitem__(self,key)
       else:
          return None

但这不是你在这里处理的内容...

请不要使用这段代码 - 它并不是一个好的示例(return dict.get(self,key,None)更好)。它只是一个易于阅读的说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接