首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Genshi和Python生成器(产量)

Genshi和Python生成器(产量)
EN

Stack Overflow用户
提问于 2014-04-18 18:40:59
回答 2查看 188关注 0票数 0

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

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

代码语言:javascript
复制
 <?python
  """ a bunch of other code ... """
  def bg_color_gen():
    """ Alternate background color every call """
    while 1:
      yield "#FFFFFF"
      yield "#EBEBEB"
  ?>

然后调用这个函数:

代码语言:javascript
复制
  <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问题。我猜根西不认识‘屈服’和运行,而‘1’无限?

而且,我也意识到我可以用一个全局跟踪计数器,然后再打电话。

代码语言:javascript
复制
 counter++
 if counter%yieldCount==0: return "#FFFFFFF"
 elif counter%yieldCount==1: return "#EBEBEB"

但这不是发电机,而且很快就会变丑!

澄清:问这个问题的另一种方法是:您将如何编码?

代码语言:javascript
复制
def fib():
    a,b = 0,1
    while True:
        yield a
        b = a+b
        yield b
        a = a+b

然后在句子中调用“第一个数字是$fib(),第二个是$fib(),第三个是$fib(),等等。”

================================================

根据已接受的答案更新完整解决方案:

代码语言:javascript
复制
<?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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-18 18:49:54

在不了解您的内容结构的情况下,我建议如下:

代码语言:javascript
复制
<fo:block py:for="i, entry in entries"
          background-color="${'#FFFFFF' if i % 2 else '#EBEBEB'}">
  ${entry}
</fo:block>

但是,如果您真的想使用生成器,那么只需使用Python的本机next()进行计算。

代码语言:javascript
复制
<py:with vars="color=bg_color_gen();">
  <fo:block background-color="${next(color)}">
</py:with>
票数 1
EN

Stack Overflow用户

发布于 2014-04-18 18:51:09

您可能希望先声明生成器,然后在其上调用next以获得yielded颜色。

在本例中,您将传递通过调用bg_color_gen() ie创建的生成器的三个不同实例)

代码语言:javascript
复制
# 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'
>>> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23160188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档