del *a: 不能在这里使用加星标的表达式

del *a: can't use starred expression here

grammar for 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 没有的所有情况下都没有麻烦通过语法将其设为非法'实际上是有道理的,他们只是让编译器在后期拒绝无意义的情况。

它很笨拙,但它确实有效,我认为两者都有助于简化解析器,and/or 为 exprlistmaybe_star_exprlist 定义和实现单独的概念太麻烦了.