在不调用方法的情况下检测它是递归的吗?

2024-06-16 09:09:21 发布

您现在位置:Python中文网/ 问答频道 /正文

这听起来像是一件愚蠢的事。上下文是测试驱动开发:我有一个方法,它涉及到遍历树的节点,为了开发这个函数,我已经使用了:
“查看子节点”
“如果子节点有子节点,则查看子节点”
“如果子节点有子节点,则查看曾孙节点”。。。等等

所以你必须用递归方法来替换代码。如果您使用的是TDD,那么您需要编写一个断言语句,如果您的方法不是递归的,则该语句将失败。对于非TDD的人来说,这听起来可能很傻,但有一点是树通常包含很多递归功能,因此跳过这种测试步骤实际上感觉“很糟糕”!在

我想知道检查模块是否有我需要的。。。但我在挣扎。在我看来,在一个理想的世界中,您可能希望检测这种递归性,而不需要实际调用该方法。在


Tags: 模块方法函数代码功能节点世界断言
2条回答

不能可靠地检查函数是否使用递归,不是吗

一个简单的递归函数将查找具有相同名称的全局函数并调用它,因此您必须查看函数字节码或将字节码解析为AST并尝试找到对同名全局对象的调用。但是如果使用的是一个方法或者函数是别名,那么您将有更困难的任务来检测它。在

此外,您通常测试被测对象的功能,而不是具体的实现。不是你想要的结果。在

也许您想避免递归,因为可能会用完堆栈。在这种情况下,您需要测试堆栈是否用完。在

将堆栈深度设置为一个小数字(使用^{}),创建一个比堆栈级别多的树,并尝试对其进行解析。如果抛出RuntimeError异常,则说明您使用的递归或其他方法过于依赖Python调用堆栈。在

即使在执行'TDD'时,检查方法是否是递归的也不是一个好主意。想想看,即使你能发现这个方法是递归的,那递归代码也有一千个错误。在

相反,在进行TDD时,提出要处理的数据集的小而好的表示形式,并编写案例以检查您正在编写的函数是否能够很好地处理它们。在

让我们考虑一个递归函数的例子来解析和查找树节点的总和。在

def total(tree):
    if tree == None: return 0
    return total(tree.left) + total(tree.right) + tree.cargo

下面是一些我会考虑测试functionality而不是测试implementation函数的测试数据案例:

确保总数正确的阳性测试

  1. 当我在树中有一个节点时,完全正确吗
  2. 当我有一个节点和两个一级子级时,总的正确性是多少
  3. 当我只有一个三级右孩子(左孩子不见)是完全正确的吗 . . 在

然后测试一些退出条件:

  1. 用一个样本树初始化测试,并根据要实现的算法检查函数是否存在于预期节点上 . . 在

添加一些阴性测试

  1. 如果树结构中存在循环,请检查是否引发异常 . . 在

等等。。。直到你学习了一些基本的组合。上两层。在

现在您知道要通过这些测试,您的函数必须执行right操作,不管递归与否。这是单元测试的目的。测试功能而不是实现的细节。

一旦您确信您的测试是可靠的,并且通过这些测试的任何函数都是一个好函数,那么该函数是如何实现的就无关紧要了。它可能是递归的,也可能不是递归的,但是在编写单元测试时,您不应该关心。在

相关问题 更多 >