你好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__
消除了歧义。 / p>
请记住,我不是在谈论在外部调用中使用其中一个,显然[]
将在这种情况下使用,但仅在方法内部,作为递归调用。
你有什么想法?
答案 0 :(得分:2)
使用[ ]
方式。它的设计就是这样。如果您唯一的担忧是误导其他代码,那么只需在代码中添加注释即可克服它。
答案 1 :(得分: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)
会更好)。这只是一个易于阅读的插图