断言是什么意思?它是如何使用的?
当前回答
def getUser(self, id, Email):
user_key = id and id or Email
assert user_key
可用于确保在函数调用中传递参数。
其他回答
assert语句有两种形式。
简单形式assert <expression>相当于
if __debug__:
if not <expression>: raise AssertionError
扩展形式assert <expression1>, <expression2>等价于
if __debug__:
if not <expression1>: raise AssertionError(<expression2>)
其他人已经为您提供了文档链接。
您可以在交互式shell中尝试以下操作:
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
第一个语句什么都不做,而第二个语句引发异常。这是第一个提示:断言用于检查在代码的给定位置(通常是函数的开始(前置条件)和结束(后置条件)中应该为真条件。
断言实际上与契约编程高度相关,这是一种非常有用的工程实践:
http://en.wikipedia.org/wiki/Design_by_contract。
assert语句几乎存在于每一种编程语言中。它有助于在程序的早期(原因很清楚的时候)检测问题,而不是在稍后作为其他操作的副作用检测问题。他们总是期待一个真实的条件。
当你这样做的时候:
assert condition
您告诉程序测试该条件,如果为假,则立即触发错误。
在Python中,assert表达式等价于:
if __debug__:
if not <expression>: raise AssertionError
你可以使用扩展表达式来传递一个可选的消息:
if __debug__:
if not (expression_1): raise AssertionError(expression_2)
在Python解释器中试试:
>>> assert True # Nothing happens because the condition returns a True value.
>>> assert False # A traceback is triggered because this evaluation did not yield an expected value.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
在使用它们之前有一些注意事项,主要是针对那些认为在assert和if语句之间切换的人。使用assert的目的是在某些情况下,当程序验证一个条件并返回一个值时,应该立即停止程序,而不是采取其他方法来绕过错误:
1. 括号
您可能已经注意到,assert语句使用了两个条件。因此,不要用圆括号把它们括起来作为一个明显的建议。如果你这样做:
assert (condition, message)
例子:
>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
你将使用(condition, message)运行断言,它表示一个元组作为第一个参数,这是因为Python中的非空元组总是True。但是,你可以单独做,没有问题:
assert (condition), "message"
例子:
>>> assert (1==2), ("This condition returns a %s value.") % "False"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: This condition returns a False value.
2. 调试的目的
如果你想知道什么时候使用assert语句。举一个现实生活中的例子:
*当你的程序倾向于控制用户输入的每个参数时:
def loremipsum(**kwargs):
kwargs.pop('bar') # return 0 if "bar" isn't in parameter
kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default
assert (len(kwargs) == 0), "unrecognized parameter passed in %s" % ', '.join(kwargs.keys())
*另一种情况是在数学中,0或非正作为某个方程的系数或常数:
def discount(item, percent):
price = int(item['price'] * (1.0 - percent))
print(price)
assert (0 <= price <= item['price']),\
"Discounted prices cannot be lower than 0 "\
"and they cannot be higher than the original price."
return price
*甚至是一个简单的布尔实现的例子:
def true(a, b):
assert (a == b), "False"
return 1
def false(a, b):
assert (a != b), "True"
return 0
3.数据处理或数据验证
最重要的是不要依赖assert语句来执行数据处理或数据验证,因为该语句可以在Python初始化时使用- o或- oo标记(分别表示值1、2和0(默认值))或PYTHONOPTIMIZE环境变量关闭。
价值1:
* assert被禁用;
*字节码文件使用.pyo而不是.pyc扩展名生成;
* sys.flags.optimize设置为1 (True);
*和,__debug__被设置为False;
值2:禁用一个东西
*文档字符串被禁用;
因此,使用assert语句来验证一种预期的数据是极其危险的,甚至意味着存在一些安全问题。然后,如果你需要验证一些权限,我建议你提出AuthError代替。作为有效的前置条件,assert通常由程序员在不与用户直接交互的库或模块上使用。
正如C2 Wiki上简要总结的那样:
断言是程序中特定位置的布尔表达式,除非程序中存在错误,否则该表达式将为真。
您可以使用断言语句来记录您对特定程序点上代码的理解。例如,您可以记录关于输入(前提条件)、程序状态(不变量)或输出(后置条件)的假设或保证。
如果断言失败,这是对您(或您的后继者)的一个警告,说明您在编写程序时对程序的理解是错误的,并且可能包含一个错误。
有关更多信息,John Regehr有一篇关于断言的使用的精彩博客文章,它也适用于Python断言语句。
如果你想知道python中保留函数的确切功能,输入help(enter_keyword)
如果您正在输入保留关键字,请确保将其输入为字符串。
推荐文章
- Numpy Max vs amax vs maximum
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 每n行有熊猫
- 实例属性attribute_name定义在__init__之外
- 如何获取在Python中捕获的异常的名称?
- 第一次出现的值大于现有值的Numpy
- 如何从Python函数中返回两个值?
- 前一个月的Python日期
- Python中方括号括起来的列表和圆括号括起来的列表有什么区别?
- Python日志记录不输出任何东西
- 每n秒运行特定代码
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何将python datetime转换为字符串,具有可读格式的日期?
- 美丽的汤和提取div及其内容的ID
- 断言是邪恶的吗?