Генераторы Genshi и Python (выход)

Как мне создать / вызвать генератор Python в Genshi? Это вообще возможно?

Например, (и нет, я не ищу альтернативного решения этой проблемы, которых много, включая перечисление для каждого и т. Д.):

 <?python
  """ a bunch of other code ... """
  def bg_color_gen():
    """ Alternate background color every call """
    while 1:
      yield "#FFFFFF"
      yield "#EBEBEB"
  ?>

И затем вызывая эту функцию:

  <fo:block background-color="${bg_color_gen()}">First entry</fo:block>
  <fo:block background-color="${bg_color_gen()}">Second entry</fo:block>
  <fo:block background-color="${bg_color_gen()}">Third entry</fo:block>

Это не имеет ничего общего с моим , который вы можете заменить на

. Это не вопрос ФО, а вопрос Генши. Я предполагаю, что Genshi не распознает 'yield' и бежит 'пока 1' до бесконечности?

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

 counter++
 if counter%yieldCount==0: return "#FFFFFFF"
 elif counter%yieldCount==1: return "#EBEBEB"

Но это не генератор, и он очень быстро уродлив!

Пояснение: еще один способ задать этот вопрос: как бы вы код

def fib():
    a,b = 0,1
    while True:
        yield a
        b = a+b
        yield b
        a = a+b

Который затем будет вызван в предложении "Первое число - это $fib(), второе - это $fib(), третье - это $ fib () и т. Д.".

================================================

Обновленное полное решение на основе принятого ответа:

<?python
def fib_generator():
    a,b = 0,1
    while True:
        yield a
        b = a+b
        yield b
        a = a+b
fib = fib_generator()
?>


The first number is ${next(fib)}, 
the second is ${next(fib)},
the third is ${next(fib)}, and so on.

2 ответа

Решение

Не зная структуры вашего контента, я бы предложил следующее:

<fo:block py:for="i, entry in entries"
          background-color="${'#FFFFFF' if i % 2 else '#EBEBEB'}">
  ${entry}
</fo:block>

Однако, если вы действительно хотите использовать генератор, вы можете просто оценить, используя нативный Python next()

<py:with vars="color=bg_color_gen();">
  <fo:block background-color="${next(color)}">
</py:with>

Вы хотели бы сначала объявить генератор, а затем вызвать next на это, чтобы получить yieldРед цвет.

В этом случае вы передаете три разных экземпляра генератора, созданного путем вызова bg_color_gen() то есть)

# this creates a generator
>>> bg_color_gen()
<generator object bg_color_gen at 0x02B21A30>
>>> bgcg = bg_color_gen()
# this gets values
>>> next(bgcg)
'#FFFFFF'
>>> next(bgcg)
'#EBEBEB'
>>> next(bgcg)
'#FFFFFF'
>>> 
Другие вопросы по тегам