LINUX.ORG.RU

История изменений

Исправление tailgunner, (текущая версия) :

Насколько я понимаю, конвейер из генераторов пишется в десяток строк.

Да. Только потом эти 10 строк придется везде копипастить, т.к функцией его сделать нельзя

Хм. Чем не подходит такая функция?

def pipeline(glst):
  def prime(x):
    if isinstance(x, FunctionType):
      pass
    elif isinstance(x, GeneratorType):
      g.next()
  def run(x, v):
    if isinstance(x, FunctionType):
      if x.func_code.co_argcount > 1 and isinstance(v, tuple):
        return x(*v)
      else:
        return x(v)
    elif isinstance(x, GeneratorType):
      v = g.send(v)
      g.next()
      return v
    else:
      assert False
  hd, tl = glst[0], glst[1:]
  assert isinstance(hd, GeneratorType)
  for g in tl:
    prime(g)
  while True:
    v = hd.next()
    for g in tl:
      v = run(g, v)
    yield v

Умеет сшивать функции и генераторы; если надо сшивать только генераторы, будет короче.

Исходная версия tailgunner, :

Насколько я понимаю, конвейер из генераторов пишется в десяток строк.

Да. Только потом эти 10 строк придется везде копипастить, т.к функцией его сделать нельзя

Хм. Чем не подходит такая функция?

def pipeline(glst):
  def prime(x):
    if isinstance(x, FunctionType):
      pass
    elif isinstance(x, GeneratorType):
      g.next()
  def run(x, v):
    if isinstance(x, FunctionType):
      if x.func_code.co_argcount > 1 and isinstance(v, tuple):
        return x(*v)
      else:
        return x(v)
    elif isinstance(x, GeneratorType):
      v = g.send(v)
      g.next()
      return v
    else:
      assert False
  hd, tl = glst[0], glst[1:]
  assert isinstance(hd, GeneratorType)
  for g in tl:
      prime(g)
  while True:
    v = hd.next()
    for g in tl:
      v = run(g, v)
    yield v

Умеет сшивать функции и генераторы; если надо сшивать только генераторы, будет короче.