python - 我对我对 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
这里有两个额外的信息需要考虑:
- 没有外部数据源,一切都来自 GUI;
- 输入验证直接在 GUI 中完成
解决方案
您的论点似乎是assert
语句非常适合调试(它们确实如此),并且您在用例中可以对每个代码路径进行充分的单元测试,您可以在生产期间自信地将它们关闭以获得性能,并且您现在怀疑显式陈述的每一种可能的使用。raise
好吧,并不是每个代码都可以测试到那种程度。“前线”的代码必须在运行时进行输入验证,并且必须使用显式检查和显式raise
语句。很高兴您的后端代码不需要担心输入验证,因为您有足够的信心在前一层处理它。在这种情况下,千万不要进行输入验证并关闭您的assert
语句。这并不意味着这在所有情况下都是可能的。例如,您的那个前端仍然需要显式运行时检查,并且可能在raise
内部显式错误。
raise
语句用于当您的程序遇到无法处理的异常情况时。您的代码向远程服务器发出 HTTP 请求,该服务器以500 Internal Error
. 那是一种特殊的情况。这不是您的代码的快乐之路。这是您的代码无法处理的情况,它只能在运行时发生,无法通过单元测试来防止这种情况。在这种情况下raise
,异常是一件非常明智的事情。
推荐阅读
- swift - SwiftUI:工作表在呈现后立即被解雇
- c++ - Allegro5 无法在 Ubuntu 20.04 上解码 png 图像(使用 cmake)
- javascript - 在 Highcharts 图表顶部绘制幽灵线
- javascript - Javascript将xhr响应字符串转换为数组
- rest - 为查询参数执行 RESTish 对象数组的最佳方法
- jenkins - 在 Jenkins email-ext 插件中,如何为 ${LOG_REGEX} 令牌指定参数(正则表达式和新输出)?
- airflow-scheduler - 有什么方法可以在本地安装 Kubernetes 上的气流
- html - 如何防止表格调整大小?
- c# - 将自定义先决条件包添加到可视安装程序 10
- python - 无法从 cefpython3 的 cefpython_py39 导入 PyBrowser