Python 语法:冒号在行尾时可以是可选的吗?
Python syntax: Could colons be optional when at end of line?
我想了解是否可以更改 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 (also available here) things are a bit different, and a bit complicated by the optional type comment 中,但总而言之,在我看来,应该可以像上面那样修改语法。
会有什么技术障碍?
更新:以下可能是 suite
更 LL(1) 友好的语法:
suite ::= colon_suite | indented_suite
colon_suite ::= ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::= NEWLINE INDENT statement+ DEDENT
由于 python 条件语句由缩进分隔,当执行块以更深缩进的新行表示时,: 将用作冗余标记。
我不确定有人说这是否适用于需要标记将条件与执行语句分开的同一行语句
抛开先行技术,语法肯定不会变得模棱两可:你所做的只是在任何行的末尾(在任何评论之前)插入一个 :
这样做可以避免语法错误(所以不是在 lambda
之后,其中一个是必要的但还不够)。特别是,除了使用反斜杠或内部括号字符(不能写 for
和 in
,或 except
和 as
之外,任何套件介绍都不能扩展到多行,例如,在单独的逻辑行上)。
唯一明显的受损诊断候选者会与三元条件表达式或生成器表达式混淆,但由于 if
/for
之前的表达式(以及括号后者)。可能根本没有技术障碍。
我想了解是否可以更改 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 (also available here) things are a bit different, and a bit complicated by the optional type comment 中,但总而言之,在我看来,应该可以像上面那样修改语法。
会有什么技术障碍?
更新:以下可能是 suite
更 LL(1) 友好的语法:
suite ::= colon_suite | indented_suite
colon_suite ::= ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::= NEWLINE INDENT statement+ DEDENT
由于 python 条件语句由缩进分隔,当执行块以更深缩进的新行表示时,: 将用作冗余标记。
我不确定有人说这是否适用于需要标记将条件与执行语句分开的同一行语句
抛开先行技术,语法肯定不会变得模棱两可:你所做的只是在任何行的末尾(在任何评论之前)插入一个 :
这样做可以避免语法错误(所以不是在 lambda
之后,其中一个是必要的但还不够)。特别是,除了使用反斜杠或内部括号字符(不能写 for
和 in
,或 except
和 as
之外,任何套件介绍都不能扩展到多行,例如,在单独的逻辑行上)。
唯一明显的受损诊断候选者会与三元条件表达式或生成器表达式混淆,但由于 if
/for
之前的表达式(以及括号后者)。可能根本没有技术障碍。