我想了解是否有可能更改Python的语法,使复合语句的冒号为可选的当它们在行的末尾时,除了空格和注释。例如:
if so()
print("yes")
else
print("no")
此更改是否会破坏现有的Python代码?会有模棱两可的构造吗?解析器在诊断某种错误时会变得非常糟糕吗?我现在会不会想到另一个问题?
当然,我知道冒号使代码更易于阅读的说法。我认为这值得商,,但我绝对不想在这里讨论观点。我的问题是关于可能的技术问题。
根据syntax of compound statements in the documentation,在":"
之前总是有suite
,其中suite
定义为
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
以if
语句为例
if_stmt ::= "if" expression ":" suite
("elif" expression ":" suite)*
["else" ":" suite]
显然,可以这样修改语法:
suite ::= ":" stmt_list NEWLINE | [":"] NEWLINE INDENT statement+ DEDENT
if_stmt ::= "if" expression suite
("elif" expression suite)*
["else" suite]
在Grammar file of the CPython source code中(也可以在here中使用),情况有些不同,并且在某些结构中,冒号后面的可选type comment有点复杂,但总的来说,在我看来这应该是可能的与上述类似地修改语法。
会有什么技术障碍?
更新:以下可能是LL(1)的一种对suite
更友好的语法:
suite ::= colon_suite | indented_suite
colon_suite ::= ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::= NEWLINE INDENT statement+ DEDENT
[不提供前瞻性技术,语法肯定不会变得模棱两可:您要做的就是在任何行的末尾(在任何注释之前)插入:
,这样可以避免语法错误(因此请不要在lambda
之后) ,但有必要但不足够的地方)。特别是,套件介绍不能扩展到多行,除了反斜杠或方括号内(例如,一个人不能在单独的逻辑行上写for
和in
或except
和as
) 。
诊断受损的唯一明显候选者可能是与三元条件表达式或生成器表达式混淆,但是由于if
/ for
(以及后者的括号)之前的表达式,因此非常弱。可能根本不会有技术障碍。
由于python条件语句由缩进分隔,所以当执行块以更深的缩进换行表示时,:将用作冗余令牌。
我不敢肯定有人说过这是否适用于需要标记以将条件与执行语句分开的同一行语句