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 为 exprlist
和 maybe_star_exprlist
定义和实现单独的概念太麻烦了.
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 为 exprlist
和 maybe_star_exprlist
定义和实现单独的概念太麻烦了.