Генераторы 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>
Это не имеет ничего общего с моим Кроме того, я понимаю, что мог бы использовать глобальный для отслеживания счетчика, а затем вызвать Но это не генератор, и он очень быстро уродлив! Пояснение: еще один способ задать этот вопрос: как бы вы код Который затем будет вызван в предложении "Первое число - это $fib(), второе - это $fib(), третье - это $ fib () и т. Д.". ================================================ Обновленное полное решение на основе принятого ответа: 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
<?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'
>>>