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

2024-03-28 11:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想了解一下,除了空格和注释之外,是否有可能改变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有点复杂,但总的来说,在我看来,应该可以修改与上面类似的语法

会有什么技术障碍


更新:以下可能是suiteLL(1)更友好的语法:

suite ::=  colon_suite | indented_suite
colon_suite ::=  ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::=  NEWLINE INDENT statement+ DEDENT

Tags: ifnewline语法语句elselistsuitestatement
2条回答

撇开前瞻性的技术问题不谈,语法肯定不会变得模棱两可:您所做的只是在任何行的末尾(在任何注释之前)插入一个:,这样做可以避免语法错误(因此不是在lambda之后,在这里需要插入一个,但这是不够的)。特别是,除了使用反斜杠或括号内的字符(例如,不能在单独的逻辑行上写入forin,或exceptas),任何套件介绍都不能扩展到多行

受损诊断的唯一明显候选是与三元条件表达式或生成器表达式混淆,但由于if/for之前的表达式(以及后者的括号),这种混淆非常弱。可能根本不会有任何技术障碍

由于python条件语句是由缩进分隔的,因此当执行块在新行中以更深的缩进表示时,:将用作冗余标记

我不确定这是否适用于同一行语句,您需要一个令牌来将条件与执行语句分开

相关问题 更多 >