2013-11-08 5 views
2

Предположим, у меня есть некоторая функция, которая принимает аргументы по умолчанию:Python карта с аргументами по умолчанию

def fn(foo=0,bar=1): 
    return something 

Как создать карту и указать, какие по умолчанию аргументы, в псевдокоде:

map(fn,foo=[1,2,3]) 

или:

map(fn,bar=[5,6,7]) 
+0

Можете ли вы уточнить, что вы пытаетесь сделать? – poke

+2

Это не отображение функции на итерабельном, а как-то попытка передать параметры функции. –

+0

@SimeonVisser есть разница? –

ответ

5

Вы можете использовать lambda, чтобы обернуть функцию параметрами по умолчанию:

map(lambda x: fn(x, bar=[1, 2, 3]), range(5)) 
+0

Спасибо, Было несколько отличных ответов, но я нашел ваш ваш предпочтительный, потому что он не использует никаких внешних модулей и просто «чувствует» право. –

+0

@Kevin: хорошая точка, я обновил свой ответ, чтобы вместо этого использовать функцию 'fn'. – mdml

1

Это лучше использовать список понимание Я думаю

[foo(bar=i) for i in [1,2,3]] 

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

либо посвященный функции

def wrapper(func, kw): 
    def wrapped(a): 
     return func(**{kw: a}) 
    return wrapped 

map(wrapper(foo, 'bar'), [1, 2, 3]) # if keyword argument is the same far all calls 

или лямбда

map(lambda x: foo(bar=x), range(5)) # if keyword argument is the same far all calls 

map(lambda x: foo(**{y:x}), ['bar', 'foo', 'bar'], range(3)) # if keyword arguments are different all calls 
+0

Сопоставление списков попадает в ловушку для меня, потому что я хочу многопоточную эту карту. –

3

Ради корректности, кажется, что partial использование должно быть

>>> from functools import partial 
>>> def fn(foo=0,bar=1): 
...  print 'foo {}, bar {}'.format(foo, bar) 
... 
>>> foo = [1,2,3] 
>>> bar = [4,5,6] 
>>> map(fn, foo) 
foo 1, bar 1 
foo 2, bar 1 
foo 3, bar 1 
[None, None, None] 
>>> map(partial(fn, 0), bar) 
foo 0, bar 4 
foo 0, bar 5 
foo 0, bar 6 
[None, None, None] 
Смежные вопросы