首页 > 解决方案 > Python 语法:在行尾时冒号可以是可选的吗?

问题描述

我想了解是否可以更改 Python 的语法,使复合语句的冒号在行尾时是可选的,除了空格和注释。例如:

if so()
    print("yes")
else
    print("no")

这种变化会破坏现有的 Python 代码吗?会有模棱两可的结构吗?解析器在诊断某种错误方面会变得非常糟糕吗?会不会还有我现在想不到的问题?

当然,我知道冒号使代码更易于阅读的论点。我认为这是有争议的,但我绝对不想在这里讨论意见。我的问题是关于可能的技术问题。

根据文档中复合语句的语法,在":"a之前总是有a 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 源代码的语法文件中(也可在此处获得),情况有些不同,并且在某些结构中冒号后的可选类型注释有点复杂,但总而言之,在我看来应该可以修改与上述类似的语法。

会有哪些技术障碍?


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

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

标签: pythonpython-3.xsyntaxcolon

解决方案


撇开前瞻技术不谈,语法肯定不会变得模棱两可:你所做的只是:在任何行的末尾(在任何评论之前)插入 a ,这样做可以避免语法错误(所以不是在 之后lambda,这是必要的但不是充足的)。特别是,除了反斜杠或括号内的字符外,任何套件介绍都不能扩展到多行(例如,不能在单独的逻辑行上写forand in, or exceptand as)。

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


推荐阅读