Python是一种动态语言,提供多种实现相同功能的方法。这些选项可能在可读性、可维护性和性能方面有所不同。虽然我通常在Python中编写的脚本是一次性的,但我现在正在做一项(学术)项目,需要可读性、可维护性和合理的性能。由于我以前没有在Python中进行过任何严肃的编码工作,包括任何类型的分析,因此我需要帮助决定上述三个因素之间的平衡。
下面是我正在使用的一个科学软件包中一个模块的代码片段。它是一个n元树类,具有非常基本的骨架结构,并考虑到了继承和子类化。
注意:在下面的代码中,树与节点是同一物。每个树都是 Tree 类的实例。
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)