在web2py中,我一直试图打破这个列表理解,这样我就可以按照它创建的类别做我喜欢的事情。关于这个细分的任何想法?
def menu_rec(items):
return [(x.title,None,URL('shop', 'category',args=pretty_url(x.id, x.slug)),menu_rec(x.children)) for x in items or []]
此外还有以下内容:
response.menu = [(SPAN('Catalog', _class='highlighted'), False, '',
menu_rec(db(db.category).select().as_trees()) )]
到目前为止,我已经提出:
def menu_rec(items):
for x in items:
return x.title,None,URL('shop', 'category',args=pretty_url(x.id, x.slug)),menu_rec(x.children))
我有其他的变化但是,每个变体只给我一个(一个)类别,与给我所有类别的原始相比。
任何人都可以看到我搞砸了这个地方吗?感谢所有的帮助,谢谢。
答案 0 :(得分:1)
列表推导通过附加:
来构建列表def menu_rec(items):
result = []
for x in items or []:
url = URL('shop', 'category', args=pretty_url(x.id, x.slug))
menu = menu_rec(x.children) # recursive call
result.append((x.title, None, url, menu))
return result
我添加了两个局部变量来稍微分解长线,并显示它如何以递归方式调用自身。
您的版本在第一次迭代期间直接从for
循环返回,并且从未构建列表。
答案 1 :(得分:0)
你不想做return
。而是附加到列表然后返回列表:
def menu_rec(items):
result = []
for x in items:
result.append(x.title,None,URL('shop', 'category',args=pretty_url(x.id, x.slug)),menu_rec(x.children)))
return result
如果执行return
,它将仅在第一次迭代后返回值。相反,继续将其添加到列表中,然后在结尾处返回该列表。这样,只有在全部添加了值后才会返回result
列表,而不是只返回一个值。