В Python, как я могу ссылаться на возвращаемое значение из функции, вызываемой в выражении генератора? - PullRequest
3 голосов
/ 13 декабря 2011

Упрощенно, я хочу сделать что-то вроде этого:

({'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 недели в Python.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Просто еще одна версия:

( dict(publication= obj.pub_name, views= obj.views) 
    for obj in map(analyze_publication, Publication.objects.all()) )
1 голос
/ 13 декабря 2011

У вас есть несбалансированные парены , но кроме этого у вас не должно быть (функциональных) проблем с вложением выражений генератора. Как и в случае со списком, они быстро становятся громоздкими при вложении. Я бы порекомендовал перенести его в именованный генератор для удобства чтения.

Если вас интересует производительность, сравните различные подходы, используя дизассемблер или профилировщики .

0 голосов
/ 13 декабря 2011

Вместо того, чтобы пытаться исказить синтаксис выражения генератора, чтобы разрешить привязку имени, я бы просто использовал функцию для создания привязки. Тогда это просто:

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

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