Как вы используете карту (reverse, ITERABLE) с аргументами для реверса? - PullRequest
0 голосов
/ 10 августа 2011

Можно вызвать reverse с аргументами, например:

reverse('page', args=['page1'])

находит URL-адрес страницы, которая принимает аргумент.

Мой вопрос: как мне это сделать, если яиспользуя карту Python?Я хочу что-то в этой форме:

map(reverse, ITERABLE)

, где итерируемый - это набор именованных URL с аргументами.До сих пор мне не удавалось это сделать. Редактировать

на основе комментариев и ответов Адама и Рульфзида:

Следующий итерируемый пример является примером, который работает как с Рульфзидомредактировать его, как подсказывает мой комментарий) и ответ Адама

iterable = [['page', ['about']], ['home', None]]

Мой единственный другой вопрос: что будет быстрее?

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Вы можете просто использовать понимание списка :

[reverse(page, args=args) for page, args in ITERABLE]

Предполагая, конечно, что ITERABLE - это что-то вроде [(page, args), (page1, arg1), ...]

2 голосов
/ 10 августа 2011

Звучит так, как будто вам нужно functools.partial.

from functools import partial
reverse_page = partial(reverse, 'page', None)
map(reverse_page, ITERABLE)

Нужно сделать трюк, если вам нужно сопоставить:

['page1', 'page2', 'page3']

без url_conf и page в качестве представления.

Вы можете использовать с ним аргументы ключевых слов, но нет необходимости создавать dict s, если вам это не нужно.

Это быстрее, чем использовать lambda или понимание списка для нетривиальных длин iterable, потому что reverse и 'page' нужно искать только один раз.

Редактировать:Если вы на самом деле не используете один аргумент снова и снова, partial - это не то, что вам нужно, просто map:

map(reverse, ('page', 'home'), itertools.repeat(None), ('about', None))

или вот так:

map(reverse, *zip(('page', None, 'about'), ('home', None, None)))

в зависимости от того, как была организована информация.Лямбда здесь не нужна, лямбда медленная.

2 голосов
/ 10 августа 2011

Предполагая, что каждый элемент в ITERABLE является кортежем (или списком), состоящим из URL-адреса и аргументов, вы можете использовать лямбда-выражения следующим образом:

map(lambda x: reverse(x[0], args=x[1]), ITERABLE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...