首页 > 解决方案 > 我对我对 Python 断言语句的使用有不同的看法,我想让你告诉我为什么我错了

问题描述

请听我说完。我知道如何assert运作。

对于上下文,我想到的一些应用程序和用法涉及通过 GUI 进行数学优化,因此这些函数可以被调用数亿次。

assert语句在优化模式 ( ) 中被禁用,因此根据大多数人的意见(也许这不仅仅是一种意见,我不知道)依赖-O它被认为是不好的做法(阅读:大罪)。

假设我有以下计算圆面积的函数:

def area_circle(r):
    return 3.141592654 * (r**2)

是的,我知道,没有文档字符串。这是一个玩具例子。为了确保它radius是 anint或 a float,我会这样做:

def area_circle(r):
    assert isinstance(r, (int, float), 'TypeError: Expected int or float, not ' + type(r).__name__
    return 3.141592654 * (r**2)

我对它的看法可能应该让我公开执行,因为我认为它是一个简洁的功能,允许我在开发时进行一些输入检查等,但是当我达到生产就绪状态时,我可以禁用优化模式下那些不必要的代码部分。如果我的系统测试涵盖了导致使用 的工作流程area_circle,那么我个人不希望看到raise声明,因为它们只是浪费。

那么我怎样才能在不使用不减慢应用程序的情况下进行集成系统测试assert呢?

编辑 1

这里有两个额外的信息需要考虑:

  1. 没有外部数据源,一切都来自 GUI;
  2. 输入验证直接在 GUI 中完成

标签: pythontestingassert

解决方案


您的论点似乎是assert语句非常适合调试(它们确实如此),并且用例中可以对每个代码路径进行充分的单元测试,您可以在生产期间自信地将它们关闭以获得性能,并且您现在怀疑显式陈述的每一种可能的使用。raise

好吧,并不是每个代码都可以测试到那种程度。“前线”的代码必须在运行时进行输入验证,并且必须使用显式检查和显式raise语句。很高兴的后端代码不需要担心输入验证,因为您有足够的信心在前一层处理它。在这种情况下,千万不要进行输入验证并关闭您的assert语句。这并不意味着这在所有情况下都是可能的。例如,您的那个前端仍然需要显式运行时检查,并且可能在raise内部显式错误。

raise语句用于当您的程序遇到无法处理的异常情况时。您的代码向远程服务器发出 HTTP 请求,该服务器以500 Internal Error. 那是一种特殊的情况。这不是您的代码的快乐之路。这是您的代码无法处理的情况,它只能在运行时发生,无法通过单元测试来防止这种情况。在这种情况下raise,异常是一件非常明智的事情。


推荐阅读