del *a: 此处不能使用带星号的表达式

wim*_*wim 5 python grammar parsing del language-lawyer

del 语句的语法

del_stmt: 'del' (expr|star_expr) (',' (expr|star_expr))* [',']
Run Code Online (Sandbox Code Playgroud)

它允许删除带星号的表达式。因此,解析器并不介意这一点,即使它会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())])])"
Run Code Online (Sandbox Code Playgroud)

是否有一些我遗漏的用法可以有一个带星号的删除目标?不应该是更简单的语法:

del_stmt: 'del' expr (',' expr)* [',']
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 2

实际语法是根据以下定义的exprlist;看起来这种关联可以追溯到 3.0 之前,那时才star_expr成为一种事物;以前,它是expr排他性的。

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

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