如何在Genshi中创建/调用python生成器?这甚至可能吗?
例如,(并且我没有寻找这个问题的替代解决方案,其中有很多,包括对每个问题进行枚举等):
<?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>
这与我的&lt;无关。 fo:block&gt ;,你可以替换为&lt; div&gt;。这不是一个FO问题,而是一个Genshi问题。 我猜测Genshi并不认识到&#39;收益率&#39;并且在1&#39;广告无限?
此外,我确实意识到我可以使用全局来跟踪计数器,然后调用
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
然后在句子中调用&#34;第一个数字是$ fib(),第二个是$ fib(),第三个是$ fib(),依此类推。&#34;
=============================================== =
根据已接受的答案更新了完整解决方案:
<?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.
答案 0 :(得分:1)
在不知道您的内容结构的情况下,我建议如下:
<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>
答案 1 :(得分:1)
您需要先声明生成器,然后在其上调用next
以获得yield
颜色。
在这种情况下,您通过调用bg_color_gen()
ie)
# 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'
>>>