【问题标题】:Check either the generator awaiting "send" or yielding the value检查等待“发送”或产生值的生成器
【发布时间】:2016-01-20 23:27:51
【问题描述】:

如何检查某个黑盒生成器是在等待值还是正在返回值?我的意思是管理以下生成器:

def gen():
  a = yield
  yield a
  yield a+1
  yield a+2

可以是:

g = gen()
g.next()
print g.send(5)
print g.next()
print g.next()

对于不同的生成器,例如:

def gen():
  a = yield
  b = yield
  yield a+b

它也需要不同,例如:

g = gen()
g.next()
g.send(1)
print g.send(2)

所以问题是如何在生成器中发送值和仅在黑盒(第三方)生成器的情况下从中获取结果之间进行选择?我需要编写以下代码:

values = [1, 2, 3]
results = list()
g = gen()
g.next()
for v in values:
  # needs this magic
  if g.__awaits__:  # in case of "x = yield" expression
    results.append(g.send(v))
  elif g.__yields__:  # in case of "yield x" expression
    results.append(g.next())

【问题讨论】:

    标签: python generator


    【解决方案1】:

    您不能,因为这两种“类型”生成器的允许操作没有任何区别。只要你调用了一次next,你就可以随时向生成器发送一个值,即使生成器没有对发送的值做任何事情:

    >>> def gen():
    ...     yield 1
    ...     yield 2
    ...     yield 3
    >>> x = gen()
    >>> next(x)
    1
    >>> x.send('hello')
    2
    >>> x.send('hello')
    3
    

    除了阅读您正在使用的任何生成器的文档外,无法判断生成器是否“需要”您发送值。

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 2019-07-17
      • 2020-10-15
      • 2019-02-14
      • 2021-06-05
      • 2013-03-02
      • 2019-01-20
      • 1970-01-01
      相关资源
      最近更新 更多