在Python中,如何从生成器表达式中调用的函数中引用返回值?

时间:2011-12-13 06:03:12

标签: python syntax generator-expression

简化,我想做这样的事情:

({'publication': obj.pub_name, 'views': obj.views, } for obj = analyze_publication(p) for p in Publication.objects.all())

当然,这不起作用。

现在,我正在使用:

({'publication': obj.pub_name, 'views': obj.views, } for obj in (analyze_publication(p) for p in Publication.objects.all()))

我不知道第二个代码片段是如何完成的,还是有另一种语法,或者效率不高等等。我只用了2周的时间。

3 个答案:

答案 0 :(得分:2)

只是另一个版本:

( dict(publication= obj.pub_name, views= obj.views) 
    for obj in map(analyze_publication, Publication.objects.all()) )

答案 1 :(得分:1)

有不平衡的parens ,但除此之外,你应该没有(功能)问题嵌套生成器表达式。与列表推导一样,它们在嵌套时很快变得难以处理。为了便于阅读,我建议将它移到命名的生成器上。

如果您对性能感到好奇,请使用disassemblerprofilers比较不同的方法。

答案 2 :(得分:0)

我不是试图扭曲生成器表达式语法以允许名称绑定,而是使用一个函数来生成绑定。然后很简单:

def pubdict(pub):
    obj = analyze_publication(pub)
    return {"publication": obj.pub_name, "views": obj.views}

itertools.imap(pubdict, Publication.objects.all()