Python Синтаксис: `for` в аргументах функции - PullRequest
2 голосов
/ 03 февраля 2020

Следующая часть скопирована из официальной, полной Python 3 грамматики .

arglist: argument (',' argument)*  [',']

argument: ( test [comp_for] |
            test ':=' test |
            test '=' test |
            '**' test |
            '*' test )

comp_iter: comp_for | comp_if
sync_comp_for: 'for' exprlist 'in' or_test [comp_iter]
comp_for: [ASYNC] sync_comp_for
comp_if: 'if' test_nocond [comp_iter]

(arglist используется в нескольких местах, где вы будете передавать аргументы вызов функции или определение класса).

Меня смущает правило argument : test [comp_for]. Поскольку генераторы . for . in . уже являются допустимыми производными от test, это, по-видимому, означает, что for в качестве аргумента функции имеет особое значение.

my_function(x for x in range(3))

Однако, просто поиграть с этим определением всегда интерпретировал его как обычный объект-генератор, который создается описанным синтаксисом.

y = (x for x in range(3))
my_function(y)

Итак, есть ли что-то особенное в этом синтаксисе? Или это просто устаревший / будущий зарезервированный код?

1 Ответ

2 голосов
/ 04 февраля 2020

(x for x in range(3)) - это выражение генератора, которое получено из нетерминала test. Но x for x in range(3) не является производным от test; скобки необходимы. Таким образом, без производства argument : test [comp_for], sum((x for x in range(3))) будет допустимым вызовом функции, но не sum(x for x in range(3)).

С другой стороны, sum(x for x in range(3)) не может быть проанализирован любым другим способом, и синтаксис кажется менее загроможденным, чем версия с дополнительными скобками. Поэтому, когда выражения генератора были введены в Python 2.4, синтаксис для списков аргументов был изменен, чтобы сделать возможным синтаксис c sugar - но только когда выражение генератора является единственным аргументом.

Вы можете найти более подробное описание изменения в PEP 289 .

...