簡體   English   中英

Genshi和Python生成器(產量)

[英]Genshi and Python Generators (yield)

如何在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不承認'收益'並且在'無限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>

你會想首先聲明發電機,然后調用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'
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM