python设计:为什么assert是语句而不是函数?

2024-09-29 21:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,assert是一个语句,而不是函数。这是一个深思熟虑的决定吗?将assert作为语句(和保留字)而不是函数有什么好处?

根据thedocs,将assert expression1, expression2展开为

if __debug__:
    if not expression1: raise AssertionError(expression2)

文档还说“当编译时请求优化时,当前的代码生成器不会为assert语句发出代码。”在不知道细节的情况下,似乎需要特殊情况才能实现这一点。但是,一个特殊情况也可以用来优化对assert()函数的调用。在

如果assert是一个函数,则可以编写:

^{pr2}$

但是由于assert是一个语句,元组的计算结果总是True,并且 你得到了

SyntaxWarning: assertion is always true, perhaps remove parentheses?

正确的写法是

assert some_long_condition, \
       "explanation"

可以说是不那么漂亮。在


Tags: 函数文档debugifnot情况assert语句
3条回答

python和其他语言(特别是C)中的assert的一个奇妙之处在于,您可以通过添加正确的#define(在我使用过的任何编译器的命令行上可选地)或优化标志(-O)来删除它们来优化代码。如果assert变成了一个函数,那么这个特性将不可能添加到python中,因为直到运行时才知道您是否拥有内置的assert函数或同名的用户定义函数。在


还要注意,在python中,函数调用相当昂贵。用代码if __debug__: ...替换inline可能比执行函数调用要高效得多,如果在性能关键的例程中放入assert语句,这可能会很有意义。在

除了其他答案(有点离题),还有一个提示。为了避免使用反斜杠,可以在圆括号内使用隐式行连接。;—)

而不是:

assert some_long_condition, \
       "explanation"

你可以写:

^{pr2}$

Are there any advantages to having assert be a statement (and reserved word) instead of a function?

  1. 不能重新分配给用户函数,这意味着可以在编译时有效地禁用它,正如@mgilson所指出的那样。在
  2. 第二个可选参数的计算将推迟到断言失败时。用函数和函数参数(需要传递lambda)很难做到这一点。不推迟第二个参数的求值会带来额外的开销。在

相关问题 更多 >

    热门问题