2016-08-16 5 views
0

У меня есть функция, которая принимает 3 параметра ключевых слов. Он имеет значения по умолчанию для x и y, и я хотел бы вызвать функцию для разных значений z, используя карту. Когда я запускаю этот код я получаю следующее сообщение об ошибке:python partial с аргументами ключевого слова

foo() got multiple values for keyword argument 'x'

def foo(x =1, y = 2, z = 3): 
    print 'x:%d, y:%d, z:%d'%(x, y, z) 


if __name__ == '__main__': 
    f1 = functools.partial(foo, x= 0, y = -6) 
    zz = range(10) 
    res = map(f1, zz) 

Есть ли Pythonic способ решить эту проблему?

+0

При размещении вопроса о коде, который выдает ошибку, пожалуйста, включите функцию Traceback. – wwii

+0

Будете ли вы создавать частичные для разных комбинаций аргументов, чем то, что вы показываете в примере? Вы ищете универсальное решение, в котором вам не нужно указывать имя * missing * arguments в частичной сигнатуре вызова? – wwii

ответ

2

map(f1, zz) пытается вызвать функцию f1 на каждом элементе в zz, но он не знает, с какими аргументами, чтобы сделать это. partial redefined foo с x=0, но map попытается переназначить x, потому что он использует позиционные аргументы.

Чтобы противостоять этому вы можете использовать простой список понимание, как в @mic4ael's ответ, или определить лямбда внутри map:

res = map(lambda z: f1(z=z), zz) 

Другим решением было бы изменить порядок аргументов в подписи функция в :

def foo(z=3, x=1, y=2): 
1

При попытке позвонить res = map(f1, zz) внутренне это фактически выглядит как [f1(i) for i in range(10). Как вы можете видеть, вы вызываете функцию f1 только с одним позиционным аргументом (в данном случае f1(x=i)). Возможным решением было бы сделать что-то вроде этого

res = [f1(z=i) for i in range(10)] 
Смежные вопросы