检查自然数,通过assertRaise验证异常

Check natural number, validate exception through assertRaise

我创建了一个 python 小函数,它提供了一个简单的检查:参数 n 是自然数吗?您通常如何完成这项检查?

这是我创建的代码:

def is_natural_number(n, print_err_msg=True):
    try:
        if not isinstance(n, int):
            raise TypeError("Your input is not of integer type.")
        if n < 1:
            raise ValueError("Your integer is less than 1.")
    except (TypeError, ValueError) as err:
        result = False
        if print_err_msg:
            print("Error: {}".format(err))
    else:
        result = True
    finally:
        return result

我正在使用 Python 3.5。我想确保此函数始终 returns TrueFalse 并在必要时处理异常。就个人而言,我不认为这段代码是好的,原因如下:

  1. 我不确定将 return 语句放入 finally 块是否合适。该代码工作正常,因为它总是 returns TrueFalse。但是,我不确定这样使用 finally 是否造成了一些不良副作用。

  2. 我无法使用 unittest 中的 assertRaises 验证 TypeErrorValueError。但是,assertRaises 在从 try 块中删除 TypeErrorValueError 并让这些异常未被处理后成功。如果通过 try 块内的 raise 引发异常,我如何使用 assertRaises 验证引发异常?

您的函数没有引发异常。

有两个异常可能会在函数内部引发,但由于它们中的每一个都被立即捕获,不会引发任何异常它,所以 assertRaises 没有什么可以抓住的。

下面是我编写函数的方式:

def is_natural_number(n):
    return isinstance(n, int) and n > 0

如果调用 is_natural_number() 的代码不需要知道它 return 的原因 False,那么 也不进行单元测试 ;他们只需要知道它是否有效。不要把事情复杂化!

旁白: 将您的 return 语句放在 finally 子句中在您的原始代码中是多余的。 finally 用于必须执行的代码,即使 try 子句中的异常未被捕获在 except 子句中,这在您的函数中不是这种情况(如果异常不是TypeErrorValueError 出现在 try 子句中,result 在任何情况下都未定义,因此当您尝试 return)。