从2.7 的正式语法:
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt |
import_stmt | global_stmt | exec_stmt | assert_stmt)
如果suite
允许,compound_stmt
那么您的建议将被接受。但这也将允许这样的事情:
if True: try:
# do something
except:
# handle
foo()
那是except
在封闭之外if
吗?是foo
外接电话if
吗?我认为这表明我们真的不希望形式语法允许内联复合语句。简单地添加suite: compound_stmt
会使语法在我阅读时变得模棱两可,其中相同的代码可以用两种或多种不同的含义来解释,两者都不可证伪。
基本上,您所问的是解析错误是设计使然。修改形式语法可以让您的示例中的代码在没有其他有趣内容的情况下工作,但需要仔细注意歧义和其他问题。
另请参阅Dangling Else,这是一个困扰标准 Algol-60 语言的语法问题。发现这类问题并不总是那么容易,因此对改变有效语法的健康恐惧是一件好事。