我想知道是否有可能改变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]
在CPython源代码的语法文件中(也可以使用here),情况有点不同,并且有些结构中冒号后面的可选类型注解有点复杂,但总而言之,在我看来,应该可以修改语法,类似于上面的语法。
会有哪些技术障碍?
更新:以下是suite
的一个更友好的LL(1)语法:
suite ::= colon_suite | indented_suite
colon_suite ::= ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::= NEWLINE INDENT statement+ DEDENT
2条答案
按热度按时间2uluyalo1#
撇开技术细节不谈,语法肯定不会变得模棱两可:你要做的就是在任何一行的末尾插入一个
:
(在任何注解之前),这样做可以避免语法错误(因此不能放在lambda
之后,因为在那里一个是必要的,但还不够)。特别是,除非使用反斜杠或括号内的字符,否则套件介绍不能扩展到多行(例如,不能在单独的逻辑线上写入for
和in
,或者except
和as
)。诊断功能受损的唯一明显可能原因是与三元条件表达式或生成器表达式混淆,但由于
if
/for
前面的表达式(以及后面的括号),这种混淆非常弱,可能根本没有技术障碍。eqfvzcg82#
由于python条件语句是由缩进分隔的,因此:当该执行单元以具有较深缩进的新行表示时,将用作冗余标记。
我不确定这是否适用于同行语句,因为您需要一个标记来将条件与执行语句分开