你如何使用带有参数的map(反向,ITERABLE)来反转?

时间:2011-08-09 20:36:43

标签: python django performance

可以使用参数调用reverse,例如:

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

找到带有参数的url命名页面。

我的问题是,如果我使用Python的地图,我该怎么做?我想要这种形式的东西:

map(reverse, ITERABLE)

其中iterable是一堆带有args的命名url。到目前为止,我一直没有成功。

根据评论和Adam和rulfzid的答案进行编辑:

以下的iterable是一个适用于rulfzid的例子(根据我的评论建议编辑它)和Adam的回答

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

我唯一的另一个问题是哪个会更快?

3 个答案:

答案 0 :(得分:3)

您可以使用list comprehension

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

当然,假设ITERABLE类似于[(page, args), (page1, arg1), ...]

答案 1 :(得分:2)

假设ITERABLE中的每个项目都是由URL和参数组成的元组(或列表),您可以像这样使用lambda:

map(lambda x: reverse(x[0], args=x[1]), ITERABLE)

答案 2 :(得分:2)

听起来你需要functools.partial

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

如果您需要映射,应该可以解决问题:

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

没有url_confpage作为视图。

您可以使用关键字args,但如果您不需要,则没有理由构造dict

使用lambda或列表理解比iterable的非平凡长度更快,因为reverse'page'只需要查找一次。

编辑:如果您实际上没有反复使用一个参数,partial不是您想要的,只是简单map

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

或者像这样:

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

取决于信息的组织方式。这里不需要lambda,lambda很慢。