大家好,
我正在实现一个二叉搜索树,它的接口与Python中的dict
基本相同(在有人问之前,我只是出于兴趣这样做,并非生产代码)。
为了向我的树添加、检索和删除元素,我已经实现了__getitem__
、__setitem__
和__delitem__
,效果很好。
问题是,由于这是一种递归数据结构,如果当前节点没有我要查找的键,则我的__getitem__
方法本身会在树的左侧或右侧分支上调用__getitem__
。
最“Pythonic”的方式是通过__getitem__
还是[]
进行这个递归调用呢?
示例:
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__
消除了歧义。
请记住,我不是在谈论在外部调用中使用其中一个,显然应该在这种情况下使用[]
,而是只在方法内部作为递归调用使用。
你有什么想法?