Python语法:冒号在行尾时可以是可选的吗?

sdnqo3pr  于 2023-01-22  发布在  Python
关注(0)|答案(2)|浏览(140)

我想知道是否有可能改变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
2uluyalo

2uluyalo1#

撇开技术细节不谈,语法肯定不会变得模棱两可:你要做的就是在任何一行的末尾插入一个:(在任何注解之前),这样做可以避免语法错误(因此不能放在lambda之后,因为在那里一个是必要的,但还不够)。特别是,除非使用反斜杠或括号内的字符,否则套件介绍不能扩展到多行(例如,不能在单独的逻辑线上写入forin,或者exceptas)。
诊断功能受损的唯一明显可能原因是与三元条件表达式或生成器表达式混淆,但由于if/for前面的表达式(以及后面的括号),这种混淆非常弱,可能根本没有技术障碍。

eqfvzcg8

eqfvzcg82#

由于python条件语句是由缩进分隔的,因此:当该执行单元以具有较深缩进的新行表示时,将用作冗余标记。
我不确定这是否适用于同行语句,因为您需要一个标记来将条件与执行语句分开

相关问题