【问题标题】:Python syntax: Could colons be optional when at end of line?Python语法:在行尾时冒号可以是可选的吗?
【发布时间】:2020-02-03 17:17:08
【问题描述】:

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

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

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

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

根据syntax of compound statements in the documentationsuite 之前总是有一个":",其中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 有点复杂,但总而言之,在我看来它应该是可以像上面一样修改语法。

会有哪些技术障碍?


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

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

【问题讨论】:

  • 立即想到的一件事,微不足道的单行词:if so(): print("yes") 解析器可能会尝试理解它,但它必须研究语义,而不仅仅是尝试理解条件: 的左侧。是的,很抱歉有意见,但在那种情况下真的很难阅读。 :)
  • @OndrejK。请再次阅读问题。在第一段中,我强调了你错过的部分。
  • 我怀疑将 : 移动到套件的定义中可能会影响语法作为 LL 语法的状态。
  • @chepner,我不这么认为,因为我认为“子句”后面的换行符不会有歧义。但我很高兴看到语法实际上存在问题。
  • 非正式地,我认为您提出的suite 定义的问题在于,将: 视为下一个标记不足以在stmt_list 规则和statement+ 规则之间进行选择;至少还需要一个令牌,以查看它是 NEWLINE 还是最终可以开始 small_stmt 的令牌之一。

标签: python python-3.x syntax colon


【解决方案1】:

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

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

【讨论】:

  • 当您说“套件介绍”时,您是指“条款”的“标题”(参见3rd paragraph here)吗? (顺便说一句,我现在意识到我对我的问题的评论是错误的,我使用“子句”而不是“标题”)
  • 另外,lambda 的部分对我来说不是很清楚
  • @WalterTross:是的,标题。给if lambda 加一个冒号并不能像给if True 加一个那样解决问题。
【解决方案2】:

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

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

【讨论】:

  • 关于你的第一句话:它没有指出任何问题。关于第二个:请再次阅读我的问题,尤其是第一段中突出显示的部分
  • 为什么会有人更改和编写两组编译器代码,一组用于单行条件,一组用于多行条件。我希望使用 : 被广泛使用,请不要尝试更改它
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2022-01-25
  • 2010-10-30
  • 2021-11-24
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多