__getitem__或递归数据结构的方括号

时间:2012-09-17 13:45:00

标签: python recursion

你好StackOverflowers,

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

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

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

通过__getitem__[]执行此递归调用的最“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

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__消除了歧义。 / p>

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

你有什么想法?

2 个答案:

答案 0 :(得分:2)

使用[ ]方式。它的设计就是这样。如果您唯一的担忧是误导其他代码,那么只需在代码中添加注释即可克服它。

答案 1 :(得分:2)

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


请注意,当您在父类上调用__getitem__时,您需要使用__getitem__而不是[...]。 e.g。

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)会更好)。这只是一个易于阅读的插图