【问题标题】:Is raise really a keyword?raise 真的是一个关键词吗?
【发布时间】: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。一元减函数吗?没有。

标签: python function object oop exception


【解决方案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 是一个关键字。现在不是了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2014-08-13
      • 2013-02-22
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      相关资源
      最近更新 更多