有人可以解释使用 WHEN 以及断言的 BEST SUITABLE 使用方案是什么?
我的观点是:
if not then raise
-O
中,它将被忽略那么源代码(不是单元测试)中assert
的使用方案是什么?
从我非常传统的经验来看,assert
应该只存在于单元测试中,真的不能说明为什么它越来越多地出现在Python项目代码中。
答案 0 :(得分:2)
在库代码中考虑断言语句的好方法是作为加载的注释,它就像一段关于代码如何工作的文档(或者你如何看待它)如果"评论"那将会爆炸并发出巨大的噪音一直在提出一个证明是错误的主张。
当您在源代码(而不是测试代码)中编写断言语句时,您应该非常确信它不会触发,无论程序输入。当然,你不能100%确定它永远不会开火,但是你应该确定如果要开火那么你在某个地方做了一个不正确的假设并且你将会这样做需要重新审视代码的这一部分。
为什么将断言添加到库代码中?如果你确定他们不会被解雇,那么重点是什么?
不要用它们来验证输入!如有必要,请使用例外。如果断言触发,那是一个错误。如果用户报告未处理的AssertionError
,则是您的问题,而不是用户的错误。有些东西需要修复。
这是一个错误断言的例子:
def square(n):
assert isinstance(n, int)
...
如果发生这种情况,那就是来电者的错。如果您需要,TypeError
比未处理的AssertionError
更合适。
这是一个ok断言的例子:
s = None
while s not in {'y', 'n'}:
s = input("do the thing? [y/n] ").lower()
if s == 'y':
# do the thing
else:
assert s == 'n'
# do other stuff
它不会验证数据,即用户无法输入会导致断言触发的任何输入 - "假设"开发人员在这里做的是,由于while
循环已退出,s
必须为'y'
或'n'
。这比elif s == 'n':
,else: raise
类型构造更好,因为永远无法访问else:
块,因此除非您进行一些非常具有侵入性的模拟,否则它将无法获得测试覆盖率。最后但并非最不重要的是,如果愚蠢的未来,它可以防止错误地进入'n'
分支的处理 - 您在提示中添加了6个选项,但只为其中5个选项添加处理(哎呀!)