5

你好 StackOverflowers 同胞,

我正在实现一个二叉搜索树,其界面与 Python 中的 a 几乎相同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

相对

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

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

你觉得呢?你有没有什么想法?

4

2 回答 2

3

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

于 2012-09-17T13:48:23.740 回答
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)会更好)。这只是一个易于阅读的插图

于 2012-09-17T13:48:44.487 回答