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   3   2012-09-17 17:44:59

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) было бы лучше). Это всего лишь легко читаемая иллюстрация

Используйте способ [ ]. Он предназначен, чтобы быть так. Если ваша единственная забота-ввести в заблуждение других пользователей вашего кода, Вы можете преодолеть ее, просто добавив комментарий к вашему коду.