getitem или квадратные скобки для рекурсивной структуры данных
Здравствуй, приятель Стаковерфлауэрс,
Я реализую бинарное дерево поиска с почти таким же интерфейсом, как и
dict в Python (прежде чем кто-либо спросит, я делаю это для удовольствия, без производственного кода). Для добавления, извлечения и удаления элементов из моего дерева я реализовал __getitem__, __setitem__ и __delitem__, который отлично работает.
Вопрос в том, поскольку это рекурсивная структура данных, мой __getitem__ метод сам вызывает __getitem__ либо на левой, либо на правой ветви дерево, если текущий узел не имеет ключа, который я ищу.
Каков самый "питонский" способ выполнения этого рекурсивного вызова, через __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__ устраняет неоднозначность.
Имейте в виду, я не говорю об использовании того или другого во внешних вызовах, ясно, что
[] будет использоваться в этом случае, но только внутри метода, как рекурсивный вызов.О чем вы думаете?
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)было бы лучше). Это всего лишь легко читаемая иллюстрация
Используйте способ
[ ]. Он предназначен, чтобы быть так. Если ваша единственная забота-ввести в заблуждение других пользователей вашего кода, Вы можете преодолеть ее, просто добавив комментарий к вашему коду.
Comments