0

如何在 Genshi 中创建/调用 python 生成器?这甚至可能吗?

例如,(不,我不是在寻找这个问题的替代解决方案,其中有很多,包括枚举 for each 等):

 <?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 不承认'yield'并且无限地运行'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.
4

2 回答 2

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>
于 2014-04-18T18:49:54.353 回答
1

您可能希望先声明生成器,然后调用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'
>>> 
于 2014-04-18T18:51:09.717 回答