python - 删除 *a : can't use starred expression here

标签 python parsing language-lawyer grammar del

grammar对于 del 语句:

del_stmt: 'del' (expr|star_expr) (',' (expr|star_expr))* [',']

它允许删除带星号的表达式。因此,解析器并不介意这一点,即使它会导致 SyntaxError: can't use starred expression here在运行时:
>>> ast.parse("del *a")
<_ast.Module at 0xcafef00d>
>>> ast.dump(compile('del *a', filename='wtf.py', mode='single', flags=ast.PyCF_ONLY_AST))
"Interactive(body=[Delete(targets=[Starred(value=Name(id='a', ctx=Del()), ctx=Del())])])"

是否有一些我遗漏的用法可以有一个带星号的删除目标?不应该是更简单的语法:
del_stmt: 'del' expr (',' expr)* [',']

为什么语法允许删除带星号的表达式?

最佳答案

实际的语法是根据 exprlist 定义的。 ;它看起来像 that association dates back to before 3.0 , 当 star_expr变成了东西;以前,它是 expr只。

基本上,语法允许它,因为他们向 exprlist 添加了一个新特性。 ,并且在 star_expr 的所有情况下都没有麻烦地通过语法将其设为非法。实际上没有意义,它们只是让编译器在稍后阶段拒绝无意义的情况。

它很hacky,但它有效,我认为要么有助于简化解析器,和/或为 exprlist 定义和实现单独的概念太麻烦了。对比 maybe_star_exprlist .

关于python - 删除 *a : can't use starred expression here,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60675597/

相关文章:

Python Pandas For 循环

python - 从 Markdown 中解析元素

实现是否可以将提示视为实际语句?

c++ - auto 带括号和初始化列表

c++ - "Undefined Behavior"真的允许*任何*发生吗?

python - 如何使用 pandas 读取大型 CSV 文件中的几行?

python - Django - 详细 View 中的日期时间字段

ios - Swift 中的正则表达式?

python - 我如何在 Python2 中对 `round` 函数进行 future 验证?

javascript - 使用 Javascript 解析文本