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 1
与return (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 关键字解读
day15——异常常用形式异常处理方法raise关键字的使用