Genshi和Python生成器(产量)

时间:2014-04-18 18:41:00

标签: python generator genshi

如何在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.

2 个答案:

答案 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'
>>>