如何在Genshi中创建/调用python生成器?这可能吗?
例如,(不,我不是在寻找这个问题的替代解决方案,其中有很多,包括For etc上的枚举,等等):
<?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问题。我猜根西不认识‘屈服’和运行,而‘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.发布于 2014-04-18 18:49:54
在不了解您的内容结构的情况下,我建议如下:
<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>发布于 2014-04-18 18:51:09
您可能希望先声明生成器,然后在其上调用next以获得yielded颜色。
在本例中,您将传递通过调用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'
>>> https://stackoverflow.com/questions/23160188
复制相似问题