__递归数据结构的getitem或方括号

2024-09-25 08:34:25 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,StackOverflowers兄弟

我正在实现一个二进制搜索树,它的接口与Python中的dict几乎相同(在任何人提出请求之前,我只是为了好玩,没有生产代码)。在

为了在树中添加、检索和删除元素,我实现了__getitem____setitem__和{},这非常好用。在

问题是,由于这是一个递归的数据结构,如果当前节点没有我要查找的键,__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

^{pr2}$

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

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

请记住,我不是说在外部调用中使用一个或另一个,显然在这种情况下,[]应该被使用,但只能在方法内部使用,作为递归调用。在

你有什么想法?在


Tags: and方法key代码selfrightnonereturn
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)会更好)。这只是一个易于阅读的插图

使用[ ]方式。它就是这样设计的。如果您唯一关心的是误导代码的其他创建者,您可以通过在代码中添加注释来克服它。在

相关问题 更多 >