断言是什么意思?它是如何使用的?
当前回答
断言是一种系统的方法,用于检查程序的内部状态是否如程序员所期望的那样,目的是捕捉错误。请参阅下面的示例。
>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>>
其他回答
断言是在我们的程序中自信地陈述事实的语句。
语法:assert <条件>或assert <条件>,<错误消息>
它有一个条件/表达式,它应该总是为真。如果条件为false, assert语句将停止程序并抛出AssertionError错误消息。你的断言表达式将是你不希望在程序中出现的东西。
e.g.
Assert <条件>——使用Assert而没有<错误消息> var = int(输入("输入值1-9包含:")) 断言var != 0 打印(var) 输出: 如果输入为0: AssertionError 如果输入为1: 1 断言<条件>,<错误消息>——使用带有<错误消息>的断言 var = int(输入("输入值1-9包含:")) 断言var !=0,"输入不能为零" 打印(var) 输出: 如果输入为0: AssertionError:输入不能为零 如果输入为1: 1
重点:
它被用作调试工具。 它接受一个表达式和一个可选消息。 它几乎存在于每一种编程语言中
Python assert基本上是一种调试辅助工具,用于测试代码内部自检的条件。 当代码进入不可能的边缘情况时,Assert使调试变得非常容易。断言检查那些不可能的情况。
假设有一个函数计算商品折扣后的价格:
def calculate_discount(price, discount):
discounted_price = price - [discount*price]
assert 0 <= discounted_price <= price
return discounted_price
这里,discounted_price永远不能小于0并且大于实际价格。因此,如果上述条件被违反,assert将引发断言错误,这有助于开发人员识别发生了不可能的事情。
希望能有所帮助。
assert语句有两种形式。
简单形式assert <expression>相当于
if __debug__:
if not <expression>: raise AssertionError
扩展形式assert <expression1>, <expression2>等价于
if __debug__:
if not <expression1>: raise AssertionError(<expression2>)
如果assert关键字后面的代码为False, Python中的assert关键字将引发AssertionError。如果没有,它继续什么都没有发生。
示例1:
a = 5
b = 6
assert a == b
输出:
AssertionError
这是因为,很明显,a不等于b。 如果你想在代码中引发一个异常,这是特别有用的。
def get_dict_key(d, k):
try:
assert k in d
return d[k]
except Exception:
print("Key must be in dict.")
上面的示例实际上是无用的,但是请记住,它主要用于调试目的,因此您可以跟踪错误。
正如在其他回答中所写的那样,assert语句用于检查 程序:在给定点上的程序
我就不重复刚才说的相关内容了 message,括号,或-O选项和__debug__常量。同时查看 首先是医生 手的信息。我将集中讨论你的问题:assert有什么用? 更准确地说,什么时候(什么时候不)应该使用assert?
assert语句对调试程序很有用,但不建议检查user 输入。我使用以下经验法则:keep断言来检测this 不应该发生的情况。一个用户 输入可能不正确,例如密码太短,但这不是一个this 不应该发生的情况。如果一个圆的直径不是它的两倍大 半径,这是不应该发生的情况。
在我看来,assert最有趣的用法是受到 通过合同编程 由B. Meyer在[面向对象软件构造]中描述( https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction%2C_2nd_Edition ),并以[Eiffel编程语言]( https://en.wikipedia.org/wiki/Eiffel_ (programming_language))。你不能完全 使用assert语句模拟契约编程,但它是 保持意图很有趣。
举个例子。假设您必须编写一个head函数(如 [Haskell中的头部功能]( http://www.zvon.org/other/haskell/Outputprelude/head_f.html))。的 给出的规范是:“如果列表不为空,则返回 清单的第一项”。看看下面的实现:
>>> def head1(xs): return xs[0]
And
>>> def head2(xs):
... if len(xs) > 0:
... return xs[0]
... else:
... return None
(是的,如果xs else None,这可以写成return xs[0],但这不是重点)。
如果列表不为空,则两个函数的结果与此结果相同 是正确的:
>>> head1([1, 2, 3]) == head2([1, 2, 3]) == 1
True
因此,两种实现(我希望)都是正确的。当你尝试的时候,它们是不同的 取一个空列表的头项:
>>> head1([])
Traceback (most recent call last):
...
IndexError: list index out of range
But:
>>> head2([]) is None
True
同样,这两种实现都是正确的,因为不应该传递空值 列出这些函数(我们不在规范范围内)。这是一个 不正确的判断,但如果你做了这样的判断,任何事情都有可能发生。 一个函数引发异常,另一个函数返回一个特殊值。 最重要的是:我们不能依赖这种行为。如果xs是空的, 这是可行的:
print(head2(xs))
但是这会使程序崩溃:
print(head1(xs))
为了避免一些意外,我想知道我什么时候经过一些意外 函数的参数。换句话说:我想知道什么时候可观察到 行为是不可靠的,因为它依赖于实现,而不是规范。 当然,我可以阅读规范,但程序员并不总是仔细阅读 文档。
想象一下,如果我有一种方法将规范插入到代码中以获得 以下效果:当我违反规范,例如通过传递一个空 清单上的人头,我会收到警告。写正确的答案会有很大的帮助 (即符合规范)程序。这就是assert的地方 进入现场:
>>> def head1(xs):
... assert len(xs) > 0, "The list must not be empty"
... return xs[0]
And
>>> def head2(xs):
... assert len(xs) > 0, "The list must not be empty"
... if len(xs) > 0:
... return xs[0]
... else:
... return None
现在,我们有:
>>> head1([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty
And:
>>> head2([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty
注意,head1抛出AssertionError,而不是IndexError。这是 因为AssertionError不是任何运行时错误:它标志着一个 违反规范。我想要一个警告,但是我得到了一个错误。 幸运的是,我可以禁用检查(使用-O选项), 但风险由我自己承担。我将会做一个坠毁真的很贵,并希望 最好的想象一下,我的程序被嵌入到一艘宇宙飞船中,它穿越 黑洞。我将禁用断言,并希望程序足够健壮 尽量不要崩溃。
这个例子只是关于前提条件的,你可以使用assert来检查 后置条件(返回值和/或状态)和不变量(对象的状态) 类)。注意,使用assert检查后置条件和不变量可以 麻烦:
对于后置条件,您需要将返回值赋给一个变量,以及 也许是用来存储对象的初始状态如果你在处理一个方法; 对于不变量,必须在方法调用之前和之后检查状态。
你不会有像埃菲尔铁塔一样复杂的东西,但你可以 提高程序的整体质量。
总之,assert语句是检测this的一种方便方法 不应该发生的情况。违反规范(例如:通过 一个空列表头)是第一类这种不应该发生的情况。 因此,虽然assert语句可用于检测任何意外情况, 这是一种确保满足规范的特权方式。 在代码中插入断言语句以表示 规格,我们可以希望您已经提高了程序的质量,因为 不正确的参数,不正确的返回值,不正确的类状态… 将被报告。
推荐文章
- 如何在f字符串中转义括号?
- Python void返回类型注释
- 如何为python模块的argparse部分编写测试?
- 在python中是否有用于均方根误差(RMSE)的库函数?
- 如何从matplotlib (pyplot。Figure vs matplotlib。figure) (frameon=False matplotlib中有问题)
- django test app error -在创建测试数据库时出现错误:创建数据库的权限被拒绝
- 识别使用pip安装的python包的依赖关系
- 从字符串变量导入模块
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?