raise 真的是一个关键词吗?

Posted

技术标签:

【中文标题】raise 真的是一个关键词吗?【英文标题】:Is raise really a keyword? 【发布时间】:2022-01-10 03:20:12 【问题描述】:

举个例子:

>>> raise(BaseException())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
BaseException

>>> raise BaseException()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
BaseException

回忆一下这句格言:

There should be one-- and preferably only one --obvious way to do it.

如果raise 是关键字,为什么在语法上允许将其视为像函数一样被调用?

还有一些其他关键字允许附加括号。 是不是很混乱?

【问题讨论】:

您只需将BaseException 放在括号中,这没有任何作用——它只是允许您跳过raise 之后的空格。您可以对if(True): 或其他方式执行相同操作。请不要。 是的,raise 确实是一个关键字。您可以通过阅读文档来回答这个问题。它不是“像函数一样被调用”,并且在那里写括号不会使其如此。您知道raise 是关键字的方式是您也可以 编写语句 不带 括号。实际上,您已经在示例中这样做了。投票结束是不可重现的,因为这是一个要求对实际不存在的事物进行解释的问题。 考虑一下:我可以写-(3) 并回复-3。一元减函数吗?没有。 【参考方案1】:

将括号括起来只是使其成为括号中的值;它不会神奇地使它成为一个函数调用。

1(1) 相同,因此return 1return (1) 相同。

但这不是函数调用。

【讨论】:

我认为有一条不成文的规则将关键字与即将发布的文本分开。当标识符附加到括号时,它就会被调用。【参考方案2】:

您可以在任何表达式周围添加括号,只是函数调用需要括号。

print 123 # error
print(123) # ok
print((123)) # extra parentheses ok

raise BaseException() # ok
raise (BaseException()) # extra parentheses ok

【讨论】:

【参考方案3】:

使用裸括号对元素没有任何作用。

因此,带括号和不带括号没有区别:

>>> (BaseException())
BaseException()
>>> BaseException()
BaseException()
>>> 

只有添加逗号才会使其成为元组。

简而言之:

raise 是关键字!

【讨论】:

【参考方案4】:

它不是作为函数调用的,你只是在异常对象周围加上了额外的括号。考虑:

ex = (BaseException())
raise ex

此外,您的第二个示例提供了反驳。如果raise 不是关键字,则该示例将失败。

【讨论】:

第二个例子让我想起了python 2.x中的print "something" 是的,在 2.x 中,print 是一个关键字。现在不是了。

以上是关于raise 真的是一个关键词吗?的主要内容,如果未能解决你的问题,请参考以下文章

python3raise,assert,nonlocal 关键字解读

你真的了解volatile关键字吗?

day15——异常常用形式异常处理方法raise关键字的使用

你真的了解[super ]关键字吗?

连载(学了这么多年C语言,你真的了解static关键词吗)乐创DIY C语言讲义​——4.4节

二分查找算法,你真的了解吗?