Ну вот, мой RSS кажется заработал. Ура-ура! Но сильное впечатление сейчас на меня произвело не это - а то, какая мощь таится в функции lambda.
Я читал, что lambda используется в Python сравнительно редко. И потому не особо утруждал себя изучением ее синтаксиса и свойств. Но вот при написании кода под RSS у меня возникла необходимость воспользоваться функцией sorted(). В книге Марка Саммерфильда по Python 3 я прочитал весьма хвалебный отзыв об этой функции (стр. 172), алгоритм которой был разработан Тимом Петерсом (Tim Peters). И действительно, функция очень красива - мне понравилось.
В файле feed.py я написал следующий класс:
class LatestFeed(Feed):
title = "My Site"
link = "/"
description = "Latest Entries of My Site"
def items(self):
items = []
posts = BlogPost.objects.order_by('-timestamp')[:5]
for post in posts:
url = '/blog/%s/' % str(post.id)
item = {'title': post.title, 'description': post.body,
'date': post.timestamp, 'url': url}
items.append(item)
return sorted(items, key=lambda item: item.get('date'), reverse=True)
def item_title(self, item):
return item.get('title')
def item_description(self, item):
return item.get('description')
def item_link(self, item):
return item.get('url')
Текст кода я несколько сократил, чтобы не растекаться мыслию по древу. Обратите внимание на функцию sorted, где в качестве второго аргумента используется key. Поначалу мне никак не удавалось воспользоваться эти аргументом, чтобы отсортировать список в нужной мне последовательности, то есть по дате в порядке убывания. (Зачем сортировать - объясняю: список items в реальности содержит в себе кроме объектов BlogPost еще и другие объекты, типа фотографий и пр. - это как раз та часть кода, которую я сократил для наглядности примера).
И вот, в разделе
Sorting Mini-HOW TO я набрел на это замечательное решение:
>>> student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Как оказалось, это то, что надо. Сортировка списка кортежей по определенному признаку. Я адаптировал это решение с учетом того, что у меня список словарей. И все замечательно заработало.
Кстати, еще одна полезная вещь в примере - функция item_list. В документации описывается требование, что для работы RSS требуется либо get_absolute_url, либо item_link. Но при этом не приводится пример item_link. Я в
одном месте набрел на пример этой функции и - вот, адаптировал его под свой случай :)