python - 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
解决方案
撇开前瞻技术不谈,语法肯定不会变得模棱两可:你所做的只是:
在任何行的末尾(在任何评论之前)插入 a ,这样做可以避免语法错误(所以不是在 之后lambda
,这是必要的但不是充足的)。特别是,除了反斜杠或括号内的字符外,任何套件介绍都不能扩展到多行(例如,不能在单独的逻辑行上写for
and in
, or except
and as
)。
诊断受损的唯一明显候选者是与三元条件或生成器表达式混淆,但这非常弱,因为if
/之前的表达式for
(以及后者的括号)。可能根本没有技术障碍。
推荐阅读
- typescript - 如何在 TS 中使用 noImplicityAny 和没有 allowJs 导入 JS
- javascript - 如何通过选择选项禁用/启用输入?
- sql - 从同一数据集中选择 2 个日期集?
- python - 永远运行 Flask 应用程序,即使在重新启动后也是如此
- directx-11 - GXMVECTOR - 文档?
- flutter - 使用 BLoC 模式和 StatelessWidget 时如何调用 dispose
- php - 在 PHP 中使用 eval() 实现 __toString()
- vb.net - 尝试通过查询数据上下文返回键/值对时无法转换对象错误
- android - 如何修复 Android 8 中损坏的意图过滤器
- google-cloud-iot - 谷歌云物联网核心证书