【发布时间】: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__消除了歧义。
请记住,我不是在谈论在外部调用中使用一个或另一个,显然[] 应该在这种情况下使用,但只能在方法内部使用,作为递归调用。
你有什么想法?
【问题讨论】: