Python | Django | Feed | Функция sorted(). Красота функции lambda. Пример item_link()

Sep 17, 2010 01:17

Ну вот, мой 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. Я в одном месте набрел на пример этой функции и - вот, адаптировал его под свой случай :)

django, программирование, python, tips

Previous post Next post
Up