2016-10-17 11 views
5

У меня есть метод:Почему добавление скобок вокруг вызова доходности в генераторе позволяет компилировать/запускать?

@gen.coroutine 
def my_func(x): 
    return 2 * x 

в основном, торнадо сопрограмма.

Я составьте список таких как:

my_funcs = [] 
for x in range(0, 10): 
    f = yield my_func(x) 
    my_funcs.append(x) 

В попытке сделать это список понимание, таких как:

my_funcs = [yield my_func(i) for i in range(0,10)] 

Я понял, что это недопустимый синтаксис. Он turns out you can do this с использованием () вокруг выхода:

my_funcs = [(yield my_func(i)) for i in range(0,10)] 
  • Означает ли это поведение (синтаксис для обертывания yield foo() вызова(), таких как (yield foo()), с тем чтобы это выше кодом для выполнения) имеют определенный тип имени ?
    • Это какая-то форма приоритета оператора с yield?
  • Это поведение с yield документировано где-то?

Python 2.7.11 на OSX. Этот код действительно должен работать как в Python2/3, поэтому использование вышеприведенного списка не является хорошей идеей (см. here для почему, приведенный выше список работает в Python 2.7, но разбит на Python 3).

+5

Из-за приоритета оператора. –

+1

@MartijnPieters, но 'yield' является [не в документах Python2 с приоритетом оператора] (https://docs.python.org/2/reference/expressions.html#operator-precedence) - код типа' m = [foobar () для i в диапазоне (0, 10)] 'работает отлично и, как ожидалось. – enderland

+0

@PadraicCunningham Я добавил пример того, почему в итоге я столкнулся со списком. – enderland

ответ

5

yield выражение должно быть в круглых скобках в любом контексте, кроме как отдельный оператор или в правой части присваивания:

# If your code doesn't look like this, you need parentheses: 
yield x 
y = yield x 

Об этом говорится в PEP that introduced yield expressions (в отличие от yield заявлений), и это вытекает из контекста, в котором yield_expr появляется в grammar, хотя никто не ждет вас читать грамматику:

выход выражение всегда должен быть в круглых скобках кроме случаев, когда происходит в выражении верхнего уровня в правой части задания .

 Смежные вопросы

  • Нет связанных вопросов^_^