【问题标题】:__getitem__ or square brackets for recursive data structure__getitem__ 或方括号用于递归数据结构
【发布时间】:2012-09-17 13:44:59
【问题描述】:

大家好,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__消除了歧义。

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

你有什么想法?

【问题讨论】:

    标签: python recursion


    【解决方案1】:

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

    【讨论】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2022-12-04
        • 1970-01-01
        • 2017-05-07
        • 2018-08-27
        • 1970-01-01
        • 2017-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多