del * a: здесь нельзя использовать помеченное выражение - PullRequest
4 голосов
/ 13 марта 2020

Грамматика для оператора 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)* [',']

Почему грамматика позволяет удалять помеченные выражения?

1 Ответ

2 голосов
/ 13 марта 2020

Фактическая грамматика определяется в терминах exprlist; Похоже, , что ассоциация восходит до 3,0 , когда star_expr стало вещь; ранее это было expr исключительно.

По сути, грамматика позволяет это, потому что они добавили новую функцию к exprlist, и не сделали go из-за того, что грамматика считалась незаконной в во всех случаях, когда star_expr на самом деле не имеет смысла, они просто заставили компилятор отклонять бессмысленные случаи на более поздней стадии.

Это глупо, но работает, и я полагаю, что либо помогает упростить анализатор, и / или слишком сложно определить и реализовать отдельные концепции для exprlist против maybe_star_exprlist.

...