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/