Python, являясь динамическим языком, который он представляет, предлагает несколько способов реализации одной и той же функции. Эти параметры могут отличаться в читаемости, ремонтопригодности и производительности. Несмотря на то, что обычные сценарии, которые я пишу на Python, имеют одноразовый характер, теперь у меня есть определенный проект, над которым я работаю (академический), который должен быть читаемым, поддерживаемым и хорошо работать. Поскольку я раньше не делал серьезного кодирования на Python, включая какой-либо профилирование, мне нужна помощь в решении баланса между тремя факторами, упомянутыми выше.
Вот фрагмент кода из одного из модулей в научном пакете, над которым я работаю. Это n-арный класс дерева с очень простой структурой скелета. Это было написано с учетом наследования и подкласса.
Примечание. В приведенном ниже коде дерево имеет то же самое, что и node. Каждое дерево является экземпляром того же дерева классов.
class Tree(object):
def __init__(self, parent=None, value=None):
self.parent = parent
self.value = value
self.children = set()
Две функции ниже относятся к этому классу (наряду со многими другими)
def isexternal(self):
"""Return True if this is an external tree."""
return not bool(self.children)
def isleaf(self):
"""Return True if this is a leaf tree."""
return not bool(self.children)
Обе эти функции выполняют одну и ту же вещь - это всего лишь два разных имени. Итак, почему бы не изменить его на что-то вроде:
def isleaf(self):
"""Return True of this is a leaf tree."""
return self.isexternal()
Мое сомнение таково:
Я читал, что вызовы функций в Python довольно дороги (создание новых стеков для каждого вызова), но я не знаю, хорошо это или плохо, если одна функция зависит от другой. Как это повлияет на ремонтопригодность. Это происходит много раз в моем коде, где я вызываю один метод из другого метода, чтобы избежать дублирования кода. Это плохая практика?
Вот еще один пример сценария дублирования кода в том же классе:
def isancestor(self, tree):
"""Return True if this tree is an ancestor of the specified tree."""
return tree.parent is self or (not tree.isroot()
and self.isancestor(tree.parent))
def isdescendant(self, tree):
"""Return True if this tree is a descendant of the specified tree."""
return self.parent is tree or (not self.isroot()
and self.parent.isdescendant(tree))
Вместо этого я мог бы пойти:
def isdescendant(self, tree):
"""Return True if this tree is a descendant of the specified tree."""
return tree.isancestor(self)