为什么在生成器中的yield调用周围添加括号允许它编译/运行?

时间:2016-10-17 19:47:20

标签: python python-2.7 tornado coroutine

我有一个方法:

@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() )以便允许执行上述代码)是否具有特定类型的名称?
    • 是{@ 1}}的某种形式的运算符优先级吗?
  • 这种行为是否在某处记录了yield

OSX上的Python 2.7.11。这段代码确实需要在Python2 / 3中工作,这就是为什么上面的列表理解不是一个好主意(参见here为什么,上面的列表comp在Python 2.7中工作但在Python 3中被破坏了。)< / p>

1 个答案:

答案 0 :(得分: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中的上下文暗示了这一点。虽然没有人期待你阅读语法:

  

yield-expression必须始终用括号括起来,除非它       发生在右侧的顶级表达式       分配