如何在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>
这与我的<fo:block>没有关系,可以将其替换为<div>。这不是一个FO问题,而是一个Genshi问题。我猜Genshi不能识别“收益率”,而是“无限期”投放“ while 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.
在不知道您的内容结构的情况下,我将提出以下建议:
<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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句