[英]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.