2012-04-13 2 views
1
def myfunc(a,b=2): 
    print("Called with", a, b) 
    return 
p1 = functools.partial(myfunc, b=4) 
p1("foobar", 4) 

Почему возникает синтаксическая ошибка при запуске этой последней строки? Он работает, если я делаю: myfunc("foobar", 4)Почему это невозможно в Python?

+0

Partial создает новую функцию, которая вызывает старую, с некоторыми предопределенными аргументами, поэтому для вызова частичной функции с тем же числом аргументов, что и исходная функция, не имеет смысла. Просто не пройдите 4, и он будет работать так, как вы планировали. –

+0

Нет синтаксической ошибки, вы имели в виду 'TypeError'? – delnan

ответ

4

'partial' уже устанавливает 'b' в 4; если вы хотите другое значение, вы должны явно установить параметр «B»:

>>> p1("foobar") 
('Called with', 'foobar', 4) 

>>> p1("foobar", b=5) 
('Called with', 'foobar', 5) 
+0

Я думаю, что для начинающих, изучающих питон, ваш ответ слишком загадочен. Можете ли вы объяснить, почему «один» должен явно задавать параметр «b»? Самое первое слово в вопросе: «Почему», а не как. –

+0

Вы правы. Хотя использование «частичного» не подходит для новичков ... – Don

+2

@Bryan Лично я не думаю, что новичок в python должен использовать частичное вообще - по крайней мере, если они не происходят из функционального фона. И попытка сделать 'partial (func, b = 5) (a, b = 4)' действительно звучит так, будто мы пытаемся решить неправильную проблему .. зачем вообще использовать частичный? – Voo

0

Потому что вы снабжая его b в functools.partial вызова. Ваш вызов должен выглядеть следующим образом:

p1("foobar") 

или вы могли бы просто избавиться от b=4 в p1 = functools.partial(myfunc, b=4) и сделать что-то вроде:

p1 = functools.partial(myfunc) 
+0

Зачем делать частичные без аргументов? Просто сделайте '' p1 = myfunc''. –

+1

(я отредактировал ваше сообщение, поэтому блоки кода правильно отформатированы :) есть подробности о том, как заставить его работать здесь: http://stackoverflow.com/editing-help#code) – huon

+0

Спасибо, что я совсем новый здесь –

0

Я думаю, это потому, что питон позволяет использовать дополнительные параметры Любой заказ. Когда вы работаете с более статически типизированными языками, обычно существует ограничение на использование необязательных параметров в порядке, определенном в функции/методе. Так, например, в питоне это законно:

def myfunc(a=1,b=2,c=3): 
    print a,b,c 

myfunc(c=99, b=13, a=12) 

Поскольку можно указать дополнительные параметры в любом порядке, я думаю, что питон явно нужно знать, какие параметры назначены для локальных переменных функции.

Смежные вопросы