Genshi和Python生成器(产量)

皮埃尔·弗朗索瓦·布鲁索

如何在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.
伊恩·克拉克(Ian Clark)

在不知道您的内容结构的情况下,我将提出以下建议:

<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章